2016-06-13 3 views
0

У меня есть 2 столбца данных. Первый - это id, а второй - значение. Может быть много вхождений одного и того же идентификатора. Мне нужно собрать данные, суммируя все значения для одного и того же идентификатора. И я хотел бы создать новый столбец с количеством вхождений одного и того же идентификатора.Суммировать переменную по группе и создать новый столбец с частотой

Например:

id value 
1 15 
1 10 
2 5 
3 7 
1 4 
3 12 
4 16 

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

id value freq 
1  29  3 
2  5  1 
3  19  2 
4  16  1 

Спасибо

ответ

3

Используя базу R, можно можно комбинировать aggregate() и table() как это:

cbind(aggregate(value ~ id, df1, sum), freq=as.vector(table(df1$id))) 
# id value freq 
#1 1 29 3 
#2 2  5 1 
#3 3 19 2 
#4 4 16 1 

данные, используемые в этом примере:

df1 <- structure(list(id = c(1L, 1L, 2L, 3L, 1L, 3L, 4L), 
       value = c(15L, 10L, 5L, 7L, 4L, 12L, 16L)), 
       .Names = c("id", "value"), class = "data.frame", 
       row.names = c(NA, -7L)) 
+2

Вы также можете сделать do.call (data.frame, aggregate (. ~ id, df1, function (x) c (sum (x), length (x)))) ' – akrun

+1

Хорошая альтернатива, @akrun. Спасибо. Но я думаю, что в этом случае, кроме того, мне придется беспокоиться о именах столбцов. – RHertel

+0

Да, вы правы в этом. – akrun

3

Мы можем использовать data.table. Преобразование «data.frame» к «data.table» (setDT(df1)), сгруппированных по «ид», получить sum о «ценности», а также от количества строк с (.N)

library(data.table) 
setDT(df1)[, .(value=sum(value), freq = .N) , by = id] 
# id value freq 
#1: 1 29 3 
#2: 2  5 1 
#3: 3 19 2 
#4: 4 16 1 

Или как @ Франк прокомментировал

dcast(setDT(df1), id ~ ., fun = list(sum, length)) 

Или аналогичный подход с dplyr

library(dplyr) 
df1 %>% 
    group_by(id) %>% 
    summarise(value = sum(value), freq = n()) 
+1

я предполагаю другой data.table путь является 'dcast (DF, идентификатор ~., fun = list (sum, length)) ' – Frank

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