【问题标题】:Finding the sum of the next n rows for every row by group [closed]按组查找每一行的下 n 行的总和 [关闭]
【发布时间】:2016-10-21 00:59:23
【问题描述】:

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

【问题讨论】:

  • 您应该阅读how to make a good reproducible example,然后使用数据和预期输出编辑您的问题。否则,您的问题将被否决和/或关闭。
  • 平面表示二维(行和列),而不是关系数据库表示的更高维。你的意思是长而不是平,所以我编辑了那个。

标签: r


【解决方案1】:

这是使用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))

【讨论】:

  • @Hack-R 我没有足够的代表来评论你的帖子,所以如果你个人认为我没有评论那里的错字,我很抱歉。
  • 如果数据集很大,我会使用inner_join,它比merge 快得多。
【解决方案2】:

有一些软件包可以促进这一点,但你并不真的需要它们。你可以通过一个简单的循环来做到这一点,甚至可以将下面的代码包装到一个函数中,然后只需 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-10
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    • 2019-04-10
    相关资源
    最近更新 更多