r - 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,则最后一列应汇总公司在焦点和前两年的所有交易。
先感谢您!
解决方案
这个怎么样?我对这一点并不太满意three_year_trans = trans + lag(trans, 1) + lag(trans, 2)
,但这是我想不到的最好的。
如果不明显,该lag(year, 2, default = 0) == year - 2
位确保没有丢失年份(例如,如果公司XXXX
有XXXX-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)
推荐阅读
- python - django.core.exceptions.ImproperlyConfigured:设置 SECRET_KEY 环境变量
- c++ - 相当于opencv中的wavedec(matlab函数)
- javascript - 如何在删除之前从 Firebase 云存储下载和发送文件?
- .net-core - 使用 nugget coverlet.msbuild / 2.3.1 在 azure devops 上运行单元测试时出错
- python - 如何合并文件中的内容?
- javascript - 无法使用 Ajax 将多部分文件从 JSP 传递到 Spring MVC 中的控制器
- python - Docker 显示空白本地容器,控制台显示“加载资源失败:服务器响应状态为 404”
- physics - Igor - 创建一个函数来产生新的数据浪潮
- qt - 有没有办法在 Listview 中获取项目的索引?
- c++ - 为 sfml 中的派生类初始化一次纹理