R:如何计算/求和某些ID的先前值?

时间:2019-02-28 08:37:37

标签: r

我有一个数据框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年可用的假人”?列的值为1,则最后一列应汇总该公司在前一年和前两年的所有交易。

提前谢谢!

2 个答案:

答案 0 :(得分:1)

这怎么样?我对three_year_trans = trans + lag(trans, 1) + lag(trans, 2)有点不满意,但这是我脑中浮现的最好成绩。

在不太明显的情况下,lag(year, 2, default = 0) == year - 2位可确保不丢失年份(例如,如果公司XXXX拥有XXXX-1999XXXX-2001,{{1} },因为缺少2000,所以2002年没有总数。

XXXX-2002

答案 1 :(得分:1)

您可以结合使用avezoo::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