#r #aggregate
#r #совокупный
Вопрос:
Я новичок в R, и, похоже, я не могу понять это: я хочу агрегировать факторы в фрейме данных путем подсчета вхождений определенного значения (в данном случае значения «Да»). Также существует множество N / As, а именно:
Текущий:
Agg Factor1 Factor2 Factor3
A1 Yes Yes Yes
A1 Yes Yes No
A1 Yes N/A No
A1 N/A No N/A
A2 Yes Yes No
A2 N/A Yes N/A
A2 No N/A N/A
Желаемый результат:
Agg F1 F2 F3
A1 3 2 1
A2 1 2 0
В идеале я хотел бы, чтобы ответ был базовым R, поскольку я пытаюсь научиться .. конечно, если есть более простое решение, использующее пакет, мне также было бы интересно.
Данные
dd <- read.table(header = TRUE, na.strings = "N/A", text =
"Agg Factor1 Factor2 Factor3
A1 Yes Yes Yes
A1 Yes Yes No
A1 Yes N/A No
A1 N/A No N/A
A2 Yes Yes No
A2 No Yes N/A
A2 N/A No N/A")
Комментарии:
1. Ммм, это (предложение @G.Grothendieck), похоже, не работает, я думаю, потому что в данных N / As. Все суммы равны N / A. То же самое с предложением @rawr.
2. Преобразуйте столбцы в символьные, а затем используйте решение @rawr :
dd[] <- lapply(dd, as.character)
. Обратите внимание, что в нем нет NAS,dd
потому что N / A — это уровень фактора, а не NA. Если вы предполагали, что это будет N / A, вам нужно будет изменить свойread.table
оператор и использоватьsum(..., na.rm = TRUE)
.3. Спасибо за вашу помощь. «, na.rm = TRUE» сделал это, и я исправил приведенную выше инструкцию read.table.
Ответ №1:
Сравнения с фактором работают с метками, поэтому это будет работать независимо от того, являются ли столбцы факторов факторами или строками:
aggregate(dd[-1L]=='Yes',dd[1L],sum,na.rm=T);
## Agg Factor1 Factor2 Factor3
## 1 A1 3 2 1
## 2 A2 1 2 0
Комментарии:
1. Да, моя проблема заключалась в частом NAs — Я не мог видеть дерево для деревьев. Добавление
na.rm=TRUE
привело меня к этому. Спасибо.