我的问题是这个问题的扩展: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)))
})
我非常感谢任何帮助或提示:)非常感谢。
答案 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()))