Удалите данные меньше определенного числа, используйте оставшуюся информацию, чтобы создать новую строку, чтобы сделать гистограмму, которая добавляет до 100%

Ответ rspeer правильно указывает на то, что unicode-escape подразумевает неявное декодирование с использованием latin-1, но не выполняет его. Если unicode-escape правильно декодирует экраны, но неправильно обрабатывает необработанные байты без ASCII, расшифровывая их как latin-1, то прямое исправление не должно принимать регулярное выражение, а затем перекодировать их как latin-1 после (отменить ошибочная часть процесса), а затем декодировать в правильной кодировке. Например, неправильное использование образца:

>>> s = 'naïve \\t test'
>>> print(s.encode('utf-8').decode('unicode_escape'))
naïve   test

можно сделать тривиально правильным, добавив .encode('latin-1').decode('utf-8'), сделав его:

>>> s = 'naïve \\t test'
>>> print(s.encode('utf-8').decode('unicode_escape').encode('latin-1').decode('utf-8'))
naïve    test
# Or using codecs.decode to replace the first encode/decode pair with a single text->text transform:
>>> print(codecs.decode(s, 'unicode_escape').encode('latin-1').decode('utf-8'))
naïve    test

Конечно, это много назад и вперед, и я бы не хотел его встроить в свой код, но его можно разделить на автономную функцию, которая работает как для str, так и для bytes (с необязательным шагом декодирования для bytes if результат в известной кодировке):

def decode_escapes(s, encoding=None):
    if isinstance(s, str):
        if encoding is not None:
            return TypeError("Do not pass encoding for string arguments")
        # UTF-8 will allow correct interpretation of escapes when bytes form
        # interpreted as latin-1
        s = s.encode('utf-8')
        encoding = 'utf-8'
    decoded = s.decode('unicode_escape').encode('latin-1')
    if encoding is not None:
        # If encoding is provided, or we started with an arbitrary string, decode
        decoded = decode.decode(encoding)
    return decoded

0
задан David Bradshaw 20 January 2019 в 15:38
поделиться

1 ответ

##Create table ready for making stacked bar graph for Phylums <1%##
# get abundance in %
phy <- transform_sample_counts(data, function(x) 100*x/sum(x))
# agglomerate taxa
glom <- tax_glom(phy, taxrank = 'Phylum')
# create dataframe from phyloseq object
dat <- psmelt(glom)
# convert Phylum to a character vector from a factor because R
dat$Phylum <- as.character(dat$Phylum)
# group dataframe by Phylum, calculate median rel. abundance
medians <- ddply(dat, ~Phylum, function(x) c(median=median(x$Abundance)))
# find Phyla whose rel. abund. is less than 1%
Other <- medians[medians$median <= 1,]$Phylum
# change their name to "Other Prokaryotes"
dat[dat$Phylum %in% Other,]$Phylum <- 'Other Prokaryotes'
#remove all Phylums labeled Other Prokaryotes
dat <-dat[!dat$Phylum=="Other Prokaryotes",]
#remove unncessary columns
dat <- subset(dat, select=c(Sample, Abundance, Phylum))
#Arrange by Abundance
dat <- arrange(dat, Abundance)
#Create a table that is the leftover Prokaryotes
Abundance <- ddply(dat, ~Sample, function(x) c(Abundance=100-sum(x$Abundance)))
#Add a column labeling the leftover Prokaryotes
Abundance$Phylum<- "Other Prokaryotes"
#combine with original table
OnePhylumdatAb <- rbind(dat, Abundance)
0
ответ дан David Bradshaw 20 January 2019 в 15:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: