Сумма ошибок 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

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

Спасибо!


person user2245731    schedule 04.08.2013    source источник
comment
sum(factor(1)) воспроизводит ошибку. Но почему у вас есть факторы в этом data.frame, а не в других? Как вы читаете свои данные?   -  person agstudy    schedule 04.08.2013
comment
@smci Не используйте тег [factor] для факторов в R.   -  person Matthew Lundberg    schedule 20.05.2014
comment
@MatthewLundberg: Попался, не знал. Мне нужно поменять кучу вещей. Поскольку факторный язык менее популярен, чем фактор R, я думаю, он должен иметь тег фактор-язык. Я подниму это на Мете.   -  person smci    schedule 20.05.2014
comment
@smci Это на обоих мета. Новый тег - [фактор-язык]. Все вопросы по языку помечены тегами. Не стесняйтесь правильно помечать вопросы по факторам R.   -  person Matthew Lundberg    schedule 20.05.2014
comment
Хорошая работа @MatthewLundberg. Обойдемся с этим.   -  person smci    schedule 20.05.2014


Ответы (1)


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

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

простое исправление, преобразовать в числовое. Однако сначала требуется промежуточный этап преобразования в символ. Используйте следующее:

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

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

person Ricardo Saporta    schedule 04.08.2013
comment
Вы запускали их код? Меня устраивает. Они уже звонят as.numeric(piedat$V3), как вы предлагаете. - person Joshua Ulrich; 04.08.2013
comment
@JoshuaUlrich Как вы получили данные? Посмотрите на 3-ю (4-ю?) Строку кода в OP as.data.frame(t(c(sum(family[8:nrow(family),1]), - person Ricardo Saporta; 04.08.2013
comment
Я использовал read.table(text="..."), так как они не предоставляют файл. Я знаю об этой строке. Он делает все столбцы символьными или факторными. Я хочу сказать, что они уже вызывают as.numeric в символьных столбцах. - person Joshua Ulrich; 04.08.2013
comment
@JoshuaUlrich, я хотел спросить, где вы взяли данные, просто для того, чтобы привлечь внимание к тому факту, что копирование + вставка работающего кода, вероятно, было связано с различиями в классах столбцов между тем, что мы будем вводить, и тем, что, вероятно, имеет спрашивающий в их среде. (да, конечно, еще одна веская причина использовать воспроизводимые примеры в ОП). Да, им звонят в as.numeric, но явно не рано :) - person Ricardo Saporta; 05.08.2013
comment
Привет, зачем нужно сначала преобразовать данные в символы? - person Trung Tran; 22.11.2014
comment
@ user1547174, причина в том, как R хранит factors - в виде чисел. Итак, если вы возьмете сумму группы факторов, вы получите целочисленный результат, но не обязательно тот, который вы ожидаете. Посмотрите (скопируйте и вставьте это) x <- as.factor(c(100, 10)); sum(as.numeric(x)); sum(as.numeric(as.character(x))); - person Ricardo Saporta; 25.11.2014
comment
спасибо, я много дней бился об этом, пытаясь агрегировать RMSE после прохождения cv - person thistleknot; 15.12.2018