dplyr 滚动更改基于多列的多列
dplyr rolling change multiple columns based on multiple columns
我正在尝试使用 dplyr
将多个事物组合在一起:鉴于我有多个 returns 的时间序列,我想计算平均相关性(我简化了我的实际任务以给出最简单的示例)所有 returns 与所有其他 returns。当然(与下面的示例相反)我的真实数据集相当大(还没有 spread(stock,ret)
)包含多个 NA。此外,在第二步中,我必须创建自己的函数并将其提供给 rollapply。因此,如果您有使用 RCpprol-package 中的东西的建议,我将非常高兴!
在下面的示例中,您可以看到我需要一次输入所有列,select一个window,同时对所有列应用一个函数,接收一个具有相同数量的向量专栏等等...
这是我的例子:
df <- data.frame(Date =as.Date("1926-01-01")+1:24,
PERMNO1 = rnorm(24,0.01,0.3),
PERMNO2 = rnorm(24,0.02,0.4),
PERMNO2 = rnorm(24,-0.01,0.6))
df %>%
do(rollapplyr(.[,-1],width=12,function(a) colMeans(cor(a))))
我想得到的是这样的:
df2 <- df; df2[,2:4]<-NA
for (i in 12:24){
df2[i,2:4] <- colMeans(cor(df[(i-12):i,2:4]))
}
df2
Date PERMNO1 PERMNO2 PERMNO2.1
1926-01-02 NA NA NA
1926-01-03 NA NA NA
1926-01-04 NA NA NA
1926-01-05 NA NA NA
1926-01-06 NA NA NA
1926-01-07 NA NA NA
1926-01-08 NA NA NA
1926-01-09 NA NA NA
1926-01-10 NA NA NA
1926-01-11 NA NA NA
1926-01-12 NA NA NA
1926-01-13 0.14701350 0.2001694 0.3787320
1926-01-14 0.15364347 0.2438042 0.3143516
1926-01-15 0.16118233 0.2549841 0.3266877
1926-01-16 0.04727533 0.2534126 0.3132990
1926-01-17 0.05220443 0.2411095 0.2744379
1926-01-18 0.12252848 0.2461743 0.2766122
1926-01-19 0.08414717 0.2287705 0.2897744
1926-01-20 0.11164866 0.2503174 0.2414130
1926-01-21 0.08886537 0.2604810 0.2621597
1926-01-22 0.14216304 0.2667540 0.2543573
1926-01-23 0.12654902 0.3086711 0.2751671
1926-01-24 0.11068607 0.3019835 0.2728166
1926-01-25 0.06714698 0.2696828 0.2184242
将数据框转换为动物园对象,运行 rollapplyr
并转换回来:
library(dplyr)
library(zoo)
df %>%
read.zoo %>%
rollapplyr(12, function(x) colMeans(cor(x)), by.column = FALSE, fill = NA) %>%
fortify.zoo
如果您只想将答案保留为动物园对象,则可以省略最后一行,这可能比将时间序列表示为数据框更方便。
我正在尝试使用 dplyr
将多个事物组合在一起:鉴于我有多个 returns 的时间序列,我想计算平均相关性(我简化了我的实际任务以给出最简单的示例)所有 returns 与所有其他 returns。当然(与下面的示例相反)我的真实数据集相当大(还没有 spread(stock,ret)
)包含多个 NA。此外,在第二步中,我必须创建自己的函数并将其提供给 rollapply。因此,如果您有使用 RCpprol-package 中的东西的建议,我将非常高兴!
在下面的示例中,您可以看到我需要一次输入所有列,select一个window,同时对所有列应用一个函数,接收一个具有相同数量的向量专栏等等...
这是我的例子:
df <- data.frame(Date =as.Date("1926-01-01")+1:24,
PERMNO1 = rnorm(24,0.01,0.3),
PERMNO2 = rnorm(24,0.02,0.4),
PERMNO2 = rnorm(24,-0.01,0.6))
df %>%
do(rollapplyr(.[,-1],width=12,function(a) colMeans(cor(a))))
我想得到的是这样的:
df2 <- df; df2[,2:4]<-NA
for (i in 12:24){
df2[i,2:4] <- colMeans(cor(df[(i-12):i,2:4]))
}
df2
Date PERMNO1 PERMNO2 PERMNO2.1
1926-01-02 NA NA NA
1926-01-03 NA NA NA
1926-01-04 NA NA NA
1926-01-05 NA NA NA
1926-01-06 NA NA NA
1926-01-07 NA NA NA
1926-01-08 NA NA NA
1926-01-09 NA NA NA
1926-01-10 NA NA NA
1926-01-11 NA NA NA
1926-01-12 NA NA NA
1926-01-13 0.14701350 0.2001694 0.3787320
1926-01-14 0.15364347 0.2438042 0.3143516
1926-01-15 0.16118233 0.2549841 0.3266877
1926-01-16 0.04727533 0.2534126 0.3132990
1926-01-17 0.05220443 0.2411095 0.2744379
1926-01-18 0.12252848 0.2461743 0.2766122
1926-01-19 0.08414717 0.2287705 0.2897744
1926-01-20 0.11164866 0.2503174 0.2414130
1926-01-21 0.08886537 0.2604810 0.2621597
1926-01-22 0.14216304 0.2667540 0.2543573
1926-01-23 0.12654902 0.3086711 0.2751671
1926-01-24 0.11068607 0.3019835 0.2728166
1926-01-25 0.06714698 0.2696828 0.2184242
将数据框转换为动物园对象,运行 rollapplyr
并转换回来:
library(dplyr)
library(zoo)
df %>%
read.zoo %>%
rollapplyr(12, function(x) colMeans(cor(x)), by.column = FALSE, fill = NA) %>%
fortify.zoo
如果您只想将答案保留为动物园对象,则可以省略最后一行,这可能比将时间序列表示为数据框更方便。