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