相当于 tidyverse 生态系统中的 ave()

equivalent of ave() in tidyverse ecosystem

我想知道在我下面的代码中 library(tidyverse) 中的 cov(sapply(dat[-1], ave, dat[1])) 是什么?

library(tidyverse)

(T1 = matrix(c(2,3,5,2, 3,4,4,5),4,2)  )      
colnames(T1) <- c("y1", "y2")

(T2 = matrix(c(4:6, 8,6,7),3,2)  )      
colnames(T2) <- colnames(T1) 

(T3 = matrix(c(7,8,10,9,7, 6,7,8,5,6),5,2)  )      
colnames(T3) <- colnames(T1) 

(dat <- map_df(list(T1,T2,T3), as_tibble, .id = 'group'))

cov(sapply(dat[-1], ave, dat[1])) # equivalent of this in tidyverse

#         y1       y2
#y1 5.624242 2.218182
#y2 2.218182 1.731818

一个选项可以是:

dat %>%
 group_by(across(1)) %>%
 mutate(across(everything(), mean)) %>%
 ungroup() %>%
 select(-1) %>%
 cov()

         y1       y2
y1 5.624242 2.218182
y2 2.218182 1.731818

我们可以在 map 中使用 ave,用 _dfc 转换为 data.frame 即。按列绑定,然后应用 cov

library(purrr)
library(dplyr)
map_dfc(dat[-1], ave, dat[1]) %>%
    cov
#         y1       y2
# y1 5.624242 2.218182 
# y2 2.218182 1.731818

或者 mutate_all

的选项
dat %>%
   group_by(group) %>% 
   mutate_all(mean) %>% 
   ungroup %>%
   select(-group) %>%
   cov

关于应用的更新评论 reduce

dat %>%
   group_by(group) %>% 
   summarise(new = list(cov(cur_data()) * (n() - 1)),
         .groups = 'drop') %>%
   pull(new) %>% 
   reduce(`+`)
#    y1  y2
#y1 14.8 1.6
#y2  1.6 9.2