Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.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 按组查找每行的下n行之和_R - Fatal编程技术网

R 按组查找每行的下n行之和

R 按组查找每行的下n行之和,r,R,我在R中有一个data.frame,它是公司每天的收益集合。它很长,但我可以把它抛得很宽。我想创建新的变量来计算公司每天接下来的7、30和90天回报的总和 有一些软件包可以实现这一点,但您并不真正需要它们。您可以通过一个简单的循环来实现这一点,甚至可以将下面的代码封装到一个函数中,只需apply或sapply即可 您所要做的就是获取一个运行总数,首先检查以确保有足够的数据来执行此操作 df1 <- data.frame( company = rep(c("Ford", "Coca-co

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

有一些软件包可以实现这一点,但您并不真正需要它们。您可以通过一个简单的循环来实现这一点,甚至可以将下面的代码封装到一个函数中,只需
apply
sapply
即可

您所要做的就是获取一个运行总数,首先检查以确保有足够的数据来执行此操作

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)

df1以下是使用
dplyr
cumsum

作为副作用,它确实会重新排列data.frame

我在借用那些

df1%
变异(c_返回值=累积和(返回值))%>%
解组()
df1%突变(天=天+6),
df1,
by=c(‘公司’,‘日期’),
后缀=c('.0','.1'),
所有.x=T)%>%
mutate(returns_7day=c_returns.1-c_returns.0+returns.0,
returns=returns.0,
天=第6天)%>%
选择(-c(returns.0,returns.1,c_returns.0,c_returns.1))

您应该阅读并编辑带有数据和预期输出的问题。否则,您的问题将被否决和/或关闭。Flat表示二维(行和列),而不是关系数据库表示的更高维度。你的意思是“长”而不是“平”,所以我编辑了这一部分。@Hack-R我还没有足够的代表对你的文章发表评论,所以如果你认为我没有对那里的打字错误发表评论,我很抱歉。如果数据集很大,我会使用
内部连接
,这比
合并
要快得多。
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))