Подтвердить что ты не робот

R "сумма не имеет смысла для факторов"

У меня есть файл rRna_RDP_taxonomy_phylum со следующими данными:

364  "Firmicutes"            39.31
244  "Proteobacteria"        26.35
218  "Actinobacteria"        23.54
65   "Bacteroidetes"         7.02
22   "Fusobacteria"          2.38
6    "Thermotogae"           0.65
3     unclassified_Bacteria  0.32
2    "Spirochaetes"          0.22
1    "Tenericutes"           0.11
1     Cyanobacteria          0.11

И я использую этот код для создания круговой диаграммы в R:

if(file.exists("rRna_RDP_taxonomy_phylum")){
    family <- read.table ("rRna_RDP_taxonomy_phylum", sep="\t")
    piedat <- rbind(family[1:7, ],
                as.data.frame(t(c(sum(family[8:nrow(family),1]),
                                "Others",
                                sum(family[8:nrow(family),3])))))
    png(file="../graph/RDP_phylum_low.png", width=600, height=550, res=75)
    pie(as.numeric(piedat$V3), labels=piedat$V3, clockwise=TRUE, col=graph_col, main="More representative Phyliums")
    legend("topright", legend=piedat$V2, cex=0.8, fill=graph_col)
    dev.off()
    png(file="../graph/RDP_phylm_high.png", width=1300, height=850, res=75)
    pie(as.numeric(piedat$V3), labels=piedat$V3, clockwise=TRUE, col=graph_col, main="More representative Phyliums")
    legend("topright", legend=piedat$V2, cex=0.8, fill=graph_col)
    dev.off()
}

Я использую этот код для разных файлов данных, и он отлично работает, но с файлом, представленным adobe, он сбой, возвращая следующее сообщение:

Error in Summary.factor(c(6L, 2L, 1L), na.rm = FALSE) : 
  sum not meaningful for factors
Calls: rbind -> as.data.frame -> t -> Summary.factor
Execution halted

Мне нужно понять, почему он сбой с этим файлом и если есть способ предотвратить подобные ошибки.

Благодарю!

4b9b3361

Ответ 1

Ошибка возникает, когда вы пытаетесь вызвать sum(x) а x является фактором.

Это означает, что один из ваших столбцов, хотя они выглядят как числа, на самом деле являются факторами (то, что вы видите, представляет собой текстовое представление)

простое исправление, преобразование в числовое. Тем не менее, он нуждается в промежуточном шаге преобразования в символ в первую очередь. Используйте следующее:

family[, 1] <- as.numeric(as.character( family[, 1] ))
family[, 3] <- as.numeric(as.character( family[, 3] ))

Для подробного объяснения того, почему необходим промежуточный шаг as.character, взгляните на этот вопрос: Как преобразовать коэффициент в целое число\число без потери информации?