首页 > 解决方案 > R:如何对某个 ID 的前值进行计数/求和?

问题描述

我有一个数据框 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,则最后一列应汇总公司在焦点和前两年的所有交易。

先感谢您!

标签: r

解决方案


这个怎么样?我对这一点并不太满意three_year_trans = trans + lag(trans, 1) + lag(trans, 2),但这是我想不到的最好的。

如果不明显,该lag(year, 2, default = 0) == year - 2位确保没有丢失年份(例如,如果公司XXXXXXXX-1999, XXXX-2001, XXXX-2002,则 2002 年将没有总计,因为缺少 2000 年。

library(dplyr)
library(tidyr)

df1 <- data.frame(ID=c('XXXX-1999','XXXX-2000', 'XXXX-2001', 'YYYY-1999', 
                       'YYYY-2000', 'ZZZZ-1999','ZZZZ-2000','ZZZZ-2001', 'ZZZZ-2002'),
                  trans=c(1,0,2,2,2,4,1,0,3))

df1 %>%
  separate(ID, c("company", "year"), "-") %>% 
  mutate(year = as.integer(year)) %>% 
  group_by(company) %>% 
  arrange(year) %>% 
  mutate(three_years_available = (lag(year, 2, default = 0) == year - 2) + 0,
         three_year_trans = if_else(three_years_available == 1,
                                    trans + lag(trans, 1) + lag(trans, 2),
                                    NA_real_)
  ) %>%
  ungroup() %>% 
  arrange(company, year)

推荐阅读