Я пытаюсь найти среднее значение временных сечений по временным рядам.
До 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
выше?