我试图找到年度横截面相关性的时间序列平均值。
在tidyverse
之前,我会:
dat
转换为年度数据框列表lapply()
查找年度横断面相关性Reduce()
手动查找手段此逻辑有效,但不是tidy
。
set.seed(2001)
dat <- data.frame(year = rep(2001:2003, each = 10),
x = runif(3*10))
dat <- transform(dat, y = 5*x + runif(3*10))
dat_list <- split(dat[c('x', 'y')], dat$year)
dat_list2 <- lapply(dat_list, cor)
dat2 <- Reduce('+', dat_list2) / length(dat_list2)
dat2
## x y
## x 1.0000000 0.9772068
## y 0.9772068 1.0000000
对于tidyerse
解决方案,我最好的(也是失败的)尝试是:
group_by()
year
变量do()
和cor()
map()
和mean()
查找元素方式此逻辑失败并返回NULL
。
library(tidyverse)
dat2 <- dat %>%
group_by(year) %>%
do(cormat = cor(.$x, .$y)) %>%
map(.$cormat, mean)
dat2
## $year
## NULL
##
## $cormat
## NULL
上面的非tidyverse
解决方案中是否有Reduce()
个成语替换tidyverse
成语?
答案 0 :(得分:1)
dat %>%
group_by(year) %>%
do(correl = cor(.data[c('x', 'y')])) %>%
{reduce(.$correl, `+`)/nrow(.)}
x y
x 1.0000000 0.9772068
y 0.9772068 1.0000000
请注意,这与cor(dat[c('x', 'y')])
完全相同,因此,除非您需要每年单独使用矩阵,否则无需按年分组,然后减少。这也适用于> 2个变量。