我在R中有一个data.frame,它是按公司每天的回报集合。它很长但我可以把它变得宽广。我想创建新的变量来计算公司每天的下一个7,30和90日收益的总和。
答案 0 :(得分:3)
以下是使用dplyr
和cumsum
它会将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)
有些软件包可以实现这一点,但你并不需要它们。您可以通过一个简单的循环来完成此操作,甚至可以将下面的代码包装到函数中,只需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)
[1] 1550 1100 1275 1600 1000 1350