按组查找每行的下n行的总和

时间:2016-10-21 00:59:24

标签: r

我在R中有一个data.frame,它是按公司每天的回报集合。它很长但我可以把它变得宽广。我想创建新的变量来计算公司每天的下一个7,30和90日收益的总和。

2 个答案:

答案 0 :(得分:3)

以下是使用dplyrcumsum

解决7天问题的解决方案

它会将data.frame重新排列为副作用。

我借用Hack-R supplied for their solution

的数据
df1 <- data.frame(
  company = rep(c("Ford", "Coca-cola", "Booz Allen Hamilton"),90),
  returns = rep(c(200,200,150,250,100,225),45),
  day     = NA
) 
df1$day[order(df1$company)] <- 1:90

df1 <- df1 %>%
       group_by(company) %>%
       arrange(day) %>%
       mutate(c_returns = cumsum(returns)) %>%
       ungroup()

df1 <- merge(df1 %>% mutate(day=day+6),
             df1,
             by=c('company','day'),
             suffixes=c('.0','.1'),
             all.x=T) %>%
       mutate(returns_7day = c_returns.1 - c_returns.0 + returns.0,
              returns=returns.0,
              day=day-6) %>%
       select(-c(returns.0, returns.1, c_returns.0, c_returns.1))

答案 1 :(得分:1)

有些软件包可以实现这一点,但你并不需要它们。您可以通过一个简单的循环来完成此操作,甚至可以将下面的代码包装到函数中,只需applysapply

您所做的就是获取总计,首先检查以确保有足够的数据。

df1 <- data.frame(
  company = rep(c("Ford", "Coca-cola", "Booz Allen Hamilton"),90),
  returns = rep(c(200,200,150,250,100,225),45),
  day     = NA
) 
df1$day[order(df1$company)] <- 1:90

df1$returns_next7  <- NA
df1$returns_next30 <- NA
df1$returns_next90 <- NA

for(c in df1$company){
  tmp <- df1[df1$company == c,]
  for(i in 1:nrow(tmp)){
    if(nrow(tmp)-i >=7){
      tmp$returns_next7[i] <- sum(tmp$returns[i:(i+6)])
    } 
  }
  df1[df1$company ==c,] <- tmp
} # Same logic for 30 and 90 days

head(df1$returns_next7)
  

[1] 1550 1100 1275 1600 1000 1350