【问题标题】:equivalent of ave() in tidyverse ecosystem相当于 tidyverse 生态系统中的 ave()
【发布时间】:2021-02-15 15:40:35
【问题描述】:

我想知道在下面的代码中 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 %&gt;% group_by(group) %&gt;% transmute_all(mean) %&gt;% ungroup() %&gt;% select(-group) %&gt;% cov()

标签: r dataframe dplyr tidyverse purrr


【解决方案1】:

一个选项可能是:

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

【讨论】:

    【解决方案2】:

    我们可以在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
    

    【讨论】:

    • Akrun,是否也可以简化这个,(Ws = group_split(dat, group, .keep = FALSE) %&gt;% map(~ cov(.) * (nrow(.) - 1))); (pooled_W = Reduce('+', Ws))
    • @rnorouzian 是的,我们可以。您还可以查看我对您的条件进行了简化的其他帖子
    • @rnorouzian 我指的是here。如果你检查输出,有两个 Reduce 条件,你正在做类似的操作,我简化了它
    • @rnorouzian 是单链进程。在您的代码中,它执行了两次相同的操作。
    • 非常感谢,我想我会保留我的初始代码。非常感谢。
    猜你喜欢
    • 2023-03-05
    • 1970-01-01
    • 2021-05-22
    • 2017-12-10
    • 2021-06-28
    • 2017-08-27
    • 1970-01-01
    • 2019-01-26
    • 2011-01-09
    相关资源
    最近更新 更多