【问题标题】:Avoid repeating as_tibble() in dplyr避免在 dplyr 中重复 as_tibble()
【发布时间】:2021-05-18 01:49:03
【问题描述】:

目前,我在最后一行代码中使用了多个 as_tibble(a_matrix) 命令。为避免重复此命令,最短的选择是什么?

(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) 

# bind rows of T1,T2 & T3 score matricies for the 3 groups:
(dat <- bind_rows(as_tibble(T1),as_tibble(T2),as_tibble(T3),.id = "group"))

【问题讨论】:

    标签: r dataframe loops dplyr tidyverse


    【解决方案1】:

    将矩阵存储在列表中,并使用map 命令将其转换为数据帧。

    list_df <- list(T1, T2, T3)
    dat <- purrr::map_df(list_df, as.data.frame, .id = 'group')
    dat
    
    #   group y1 y2
    #1      1  2  3
    #2      1  3  4
    #3      1  5  4
    #4      1  2  5
    #5      2  4  8
    #6      2  5  6
    #7      2  6  7
    #8      3  7  6
    #9      3  8  7
    #10     3 10  8
    #11     3  9  5
    #12     3  7  6
    

    【讨论】:

    • list_df &lt;- mget(paste0('T', 1:3)) 但是,这将给组值T1T2T3。您可以通过使用 sub 从它们中删除 'T' 将其更改为 1、2、3。
    【解决方案2】:

    data.table

    library(data.table)
    list_df <- list(T1, T2, T3) 
    rbindlist(lapply(list_df, as.data.frame), idcol = 'group')
    

    或使用base R

    lst1 <- mget(str_c('T', 1:3))
    out <- do.call(rbind, Map(cbind, group = seq_along(lst1), lst1))
    

    并应用一次as_tibble

    as_tibble(out)
    

    【讨论】:

      猜你喜欢
      • 2017-09-20
      • 2015-04-05
      • 1970-01-01
      • 1970-01-01
      • 2015-01-04
      • 2018-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多