如何计算我的数据框中每个id每月的change_flag

时间:2016-02-17 00:22:03

标签: r data.table

我有一个像这样的数据框。

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来实现这个目的

1 个答案:

答案 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