添加另一列的计数,具体取决于另一列

时间:2017-08-25 15:29:29

标签: r

我的问题是这个问题的扩展: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的周数)< / p>

我尝试过这两种方法及其混合但似乎找不到合适的方法:

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))) })

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

1 个答案:

答案 0 :(得分:1)

使用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()))