2015-12-18 2 views
2

Я использую функцию агрегата, чтобы получить счет по группе. Агрегатная функция возвращает только количество групп, если число> 0. Это то, что у меня естьгруппа по счету, когда число равно нулю в r

dt <- data.frame(
n = c(1,2,3,4,5,6), 
id = c('A','A','A','B','B','B'), 
group = c("x","x","y","x","x","x")) 

применением агрегатной функции

my.count <- aggregate(n ~ id+group, dt, length) 

теперь видим результаты

my.count[order(my.count$id),] 

я получаю следующее

id group n 
1 A  x 2 
3 A  y 1 
2 B  x 3 

мне нужно следующее (последняя строка имеет нуль, что мне нужно)

id group n 
1 A  x 2 
3 A  y 1 
2 B  x 3 
4 B  y 0 

спасибо вам помочь в заранее

ответ

3

Вы можете merge свой «my.count» объект с полным набором «ид "и„группа“колонки:

merge(my.count, expand.grid(lapply(dt[c("id", "group")], unique)), all = TRUE) 
## id group n 
## 1 A  x 2 
## 2 A  y 1 
## 3 B  x 3 
## 4 B  y NA 

Там несколько вопросов на SO, которые покажут вам, как заменить NA с 0, если это требуется.

5

Мы можем создать еще один столбец «Ind», а затем использовать dcast перекроить из «долго» до «широкий», указав fun.aggregate в length и drop=FALSE.

library(reshape2) 
dcast(transform(dt, ind='n'), id+group~ind, 
      value.var='n', length, drop=FALSE) 
# id group n 
#1 A  x 2 
#2 A  y 1 
#3 B  x 3 
#4 B  y 0 

Или base R вариант

as.data.frame(table(dt[-1])) 
0

Если вы заинтересованы в частотах только вы создаете с вашей формуле таблицы частот превратить его в dataframe:

as.data.frame(xtabs(formula = ~ id + group, dt)) 

Очевидно, что это не сработает для других агрегатных функций. Я все еще жду, когда функция суммирования dplyr позволит пользователю решить, сохраняются ли нулевые группы или нет. Возможно, вы можете проголосовать за это улучшение здесь: https://github.com/hadley/dplyr/issues/341

Смежные вопросы