我有一个像这样的数据框。
database
id change_flag month_end
1 R018 0 0
2 K018 1 0
3 R018 1 1
4 K018 1 1
5 R018 0 1
6 K018 1 0
7 R018 1 1
8 R018 0 1
9 K018 1 1
10 R018 1 1
11 R018 1 0
12 R018 0 0
13 R018 1 1
14 R018 0 0
15 K018 1 0
这里change_flag 1表示发生了变化,month_end 1表示月末,0表示不是月末。
现在对于两个ID,我想计算每个月发生的变化。 但是我无法弄清楚如何实现这一目标。谢谢
id change_flag month_end changePerMonth
1: R018 0 0 NA
2: R018 1 1 1
3: R018 0 1 0
4: R018 1 1 1
5: R018 0 1 0
6: R018 1 1 1
7: R018 1 0 NA
8: R018 0 0 NA
9: R018 1 1 2
10: R018 0 0 NA
11: K018 1 0 NA
12: K018 1 1 2
13: K018 1 0 NA
14: K018 1 1 2
15: K018 1 0 NA
有没有办法用data.table来实现这个目的
答案 0 :(得分:3)
这是一次尝试:
database$chperm <- NA
database$chperm[database$month_end==1] <- with(
database,
ave(
change_flag,
list(id,rev(cumsum(rev(month_end)))),
FUN=sum
)
)[database$month_end==1]
在data.table世界中,我会尝试:
database[, chpermdt := sum(change_flag), by=list(id,rev(cumsum(rev(month_end))))]
database[month_end != 1, chpermdt := NA]
两者都给:
# id change_flag month_end changePerMonth chperm
#1: R018 0 0 NA NA
#2: R018 1 1 1 1
#3: R018 0 1 0 0
#4: R018 1 1 1 1
#5: R018 0 1 0 0
#6: R018 1 1 1 1
#7: R018 1 0 NA NA
#8: R018 0 0 NA NA
#9: R018 1 1 2 2
#10: R018 0 0 NA NA
#11: K018 1 0 NA NA
#12: K018 1 1 2 2
#13: K018 1 0 NA NA
#14: K018 1 1 2 2
#15: K018 1 0 NA NA