R:如何对特定ID的前面的值进行计数/求和?
我有一个数据框架df1,其中包含了一家公司在某一年内进行的收购数量的信息。我需要 a) 如果每个公司每年都有连续三年的观察数据,则构造一个虚拟变量 b) 如果该公司年度有三个连续的前几年,则将该三年期间的收购数量相加R:如何对特定ID的前面的值进行计数/求和?,r,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'),
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))
因此,如果“3年前可用虚拟年数”列的值为1,则最后一列应汇总该公司在重点年份和前两年的所有交易
提前谢谢你 这怎么样?我对
3年
bit不太满意,但这是我脑子里想得最好的了
在不明显的情况下,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)
库(dplyr)
图书馆(tidyr)
df1%
单独(ID,c(“公司”、“年度”),“-”%>%
变异(年=整数(年))%>%
集团(公司)%>%
安排(年)%>%
变异(三年可用=(滞后(年,2,默认值=0)=年-2)+0,
三年交易=如果其他(三年可用==1,
变速器+滞后(变速器,1)+滞后(变速器,2),
纳乌(雷亚尔)
) %>%
解组()%>%
安排(公司、年度)
您可以使用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
图书馆(动物园)
df1$trans.sum为什么最后一行是#ZZZZ-2002 3 1 8
?不应该是#ZZZZ-2002 3 1 4
?你介意ID
列分为company
和year
?是的,你绝对正确,我现在在原始帖子中进行了编辑。我不介意ID列分为companyd年,如果这使它更容易的话!谢谢你,这个解决方案是非常直接的,成功了!
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