我有每月股票回报的数据:
d<-data.frame(replicate(5,sample(rnorm(1),6,rep=TRUE)))现在,我想以以下方式将这些返回转换为n个月的返回(例如,对于n=3):
d[1,1]=(1+d[1,1])*(1+d[2,1])*(1+d[3,1])
d[2,1]=(1+d[2,1])*(1+d[3,1])*(1+d[4,1])
d[3,1]=(1+d[3,1])*(1+d[4,1])*(1+d[5,1])下一篇专栏也是如此:
d[1,2]=(1+d[1,2])*(1+d[2,2])*(1+d[3,2])
d[2,2]=(1+d[2,2])*(1+d[3,2])*(1+d[4,2])
d[3,2]=(1+d[3,2])*(1+d[4,2])*(1+d[5,2])我想你知道这个主意了。
现在,我的想法是:
apply(d, 2, fun)其中,乐趣被定义为:
fun<-function(df_column)
{
# Loop over df_column rows
for (row in 1:nrow(df_column)) {
d[row]=(1+d[row])*(1+d[row+1])*(1+d[row+2])
}
}这种方法有意义吗?还是有一种更优雅的方法?
发布于 2017-12-05 04:39:49
根据您喜欢的内容,尝试使用以下形式之一的rollapply。第一行将NAs放在最后两行。第二行用部分产品填充它们,第三行删除最后两行。3参数指定滚动产品的宽度,如果要尝试其他宽度,则可以更改。有关更多信息,请参见?rollapply。
library(zoo)
rollapplyr(d + 1, 3, prod, align = "left", fill = NA)
rollapplyr(d + 1, 3, prod, align = "left", partial = TRUE)
rollapplyr(d + 1, 3, prod, align = "left")发布于 2017-12-05 04:34:35
您可以使用purrr::map_df和dplyr::lead来实现您所追求的目标。
library(dplyr)
library(purrr)
set.seed(42)
df <- data.frame(replicate(5, rnorm(6)))
df %>%
map_df(function(x) {
(1 + x) * (1 + lead(x, 1)) * (1 + lead(x, 2))
})
# # A tibble: 6 x 5
# X1 X2 X3 X4 X5
# <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 1.4068610 6.863243 -0.2430606 -2.3172461 1.2246900
# 2 0.9688954 2.561324 1.0225645 -1.2568729 -0.3228241
# 3 3.1256224 6.520767 1.0148172 -0.4485965 -0.8276191
# 4 2.0496361 7.100212 -1.9395879 -1.4328679 -0.4011510
# 5 NA NA NA NA NA
# 6 NA NA NA NA NAN.B.当您展望两项记录时,请注意,最后两行只会产生
NA。如果希望将na.omit或tidyr::drop_na排除在外,可以将它们添加到管道中。
https://stackoverflow.com/questions/47645897
复制相似问题