Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R:如何对特定ID的前面的值进行计数/求和?_R - Fatal编程技术网

R:如何对特定ID的前面的值进行计数/求和?

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,其中包含了一家公司在某一年内进行的收购数量的信息。我需要

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))
因此,如果“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