与另一计数添加列,根据另一列
问题描述:
我的问题是这样的一个的延伸: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))) })
我非常感谢任何帮助或提示:)非常感谢。
答
使用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()))
'AVE(DF $周, df $ Week,df $ Contact.ID,FUN = length)' –
请参阅'dplyr'中的'group_by'和'tally'或者只是'n'。 – ulfelder
@ d.b非常感谢! – Fee