我有一个数据框df1,其中包含公司在某一年内进行的收购数量的信息。我需要
a)如果每年每家公司有连续三年的观察结果,则构建一个虚拟变量
b)如果该公司年度连续三年,则将该三年期间的收购数量相加
df1 <- data.frame(ID=c('XXXX-1999','XXXX-2000', 'XXXX-2001', 'YYYY-1999',
'YYYY-2000', 'ZZZZ-1999','ZZZZ-2000','ZZZZ-2001', 'ZZZZ-2002'),
No.of.Transactions=c(1,0,2,2,2,4,1,0,3))
其中ID是一年内公司的观察结果。所需的输出如下
# Desired output
# ID | No.of.Transactions | 3 preceding yrs available dummy? |
No.of.Transactions during 3 preceding yrs
# XXXX-1999 1 0 N/A
# XXXX-2000 0 0 N/A
# XXXX-2001 2 1 3
# YYYY-1999 2 0 N/A
# YYYY-2000 2 0 N/A
# ZZZZ-1999 4 0 N/A
# ZZZZ-2000 1 0 N/A
# ZZZZ-2001 0 1 5
# ZZZZ-2002 3 1 4
那么,如果“前面的3个可用假人?” column取值为1,然后最后一列应该总结公司在焦点和前两年的所有交易。
可以使用的组合ave和zoo::rollsumr。如果您仍然需要虚拟变量,则可以从事务和变量轻松创建它。
library(zoo)
df1$trans.sum <- with(df1, ave(No.of.Transactions, sub("(^.{4}).*", "\\1", ID),
FUN = function(x) rollsumr(x, 3, fill = NA)))
df1
ID No.of.Transactions trans.sum
1 XXXX-1999 1 NA
2 XXXX-2000 0 NA
3 XXXX-2001 2 3
4 YYYY-1999 2 NA
5 YYYY-2000 2 NA
6 ZZZZ-1999 4 NA
7 ZZZZ-2000 1 NA
8 ZZZZ-2001 0 5
9 ZZZZ-2002 3 4