与另一计数添加列,根据另一列

问题描述:

我的问题是这样的一个的延伸:Create a column with a count of occurrences in R与另一计数添加列,根据另一列

鉴于他们的榜样,我想看看有多少每个人都有每个产品的计数。

我有具有这种结构一个非常大的数据集:

df <- c(Contact.ID, Date.Time, Week, Attendance, WeeklyAT) 

Contact.ID  Date Time Week Attendance *WeeklyAT 
1 A  2012-10-06 18:54:48 44   30   *2 
2 A  2012-10-08 20:50:18 44   30   *2 
3 A  2013-05-24 20:18:44 21   30   *1 
4 B  2012-11-15 16:58:15 46   40   *1 
5 B  2013-01-09 10:57:02 2   40   *3 
6 B  2013-01-11 17:31:22 2   40   *3 
7 B  2013-01-14 18:37:00 2   40   *3 
8 C  2013-02-22 17:46:07 8   5   *1 
9 C  2013-02-27 11:21:00 9   5   *1 
10 D  2012-10-28 14:48:33 43   12   *1 

我试图找到WeeklyAT列,计算出现的频率,每周数每个ID(这是区别其他问题,如我不看一般发生或每个ID周)

我已经试过他们的这两种方法和混合物,但似乎无法找到合适的人的数量:

df <- transform(df, WeeklyAT = ave(seq(nrow(df)), Gym$Week, FUN=length))

df <- within(df, { WeeklyAT = ave(df$Week, df$Contact.ID, FUN = function(x) length(unique(x))) })

我非常感谢任何帮助或提示:)非常感谢。

+0

'AVE(DF $周, df $ Week,df $ Contact.ID,FUN = length)' –

+0

请参阅'dplyr'中的'group_by'和'tally'或者只是'n'。 – ulfelder

+0

@ d.b非常感谢! – Fee

使用data.table你可以这样做以下:

library(data.table) 
setDT(df) 
merge(df, df[, WeeklyAT := .N, by = .(Contact.ID, Week)]) 

     Contact.ID  Date  Time Week Attendance X.WeeklyAT WeeklyAT 
1:   A 2012-10-06 18:54:48 44   30   *2  2 
2:   A 2012-10-08 20:50:18 44   30   *2  2 
3:   A 2013-05-24 20:18:44 21   30   *1  1 
4:   B 2012-11-15 16:58:15 46   40   *1  1 
5:   B 2013-01-09 10:57:02 2   40   *3  3 
6:   B 2013-01-11 17:31:22 2   40   *3  3 
7:   B 2013-01-14 18:37:00 2   40   *3  3 
8:   C 2013-02-22 17:46:07 8   5   *1  1 
9:   C 2013-02-27 11:21:00 9   5   *1  1 
10:   D 2012-10-28 14:48:33 43   12   *1  1 

编辑:

显然dplyr可以做一些非常相似:

library(dplyr) 
merge(df, 
     df %>% group_by(Contact.ID, Week) %>% summarise(WeeklyAT = n()))