【问题标题】:Concatenate multiple df in list into different columns of a single df将列表中的多个 df 连接到单个 df 的不同列中
【发布时间】:2021-03-25 13:04:15
【问题描述】:

我在 R 中有一个由 40 个数据帧组成的数据帧(df1)列表,每个数据帧只有 1 列(V1)。我想将 df1 中的所有数据帧连接成一个数据帧 (df2),其中 df1 中的每个数据帧都变成了 df2 中的一列。

到目前为止,我正在这样做:

df2 <- bind_rows(df1, .id = "column_label")

head(df2)   
column_label         V1
Hazt              miR-92
Hazt              miR-92
Hazt              miR-92
Hazt              miR-184
Hazt              miR-184
PPee              miR-92
PPee              miR-3

但是,如前所述,我希望新的数据框看起来像这样

Hazt       PPee 
miR-92     miR-92
miR-92     miR-3
miR-92
miR-184
miR-184

与 df1 中的原始数据帧一样多的列。

【问题讨论】:

  • 第二列的预期输出有NA 还是空白?
  • 最好留空

标签: r dataframe


【解决方案1】:

使用list2DF + unstack 的基本 R 选项

> list2DF(lapply(u <- unstack(rev(df2)), `length<-`, max(lengths(u))))
     Hazt   PPee
1  miR-92 miR-92
2  miR-92  miR-3
3  miR-92   <NA>
4 miR-184   <NA>
5 miR-184   <NA>

【讨论】:

    【解决方案2】:

    如果df1list,那么试试这个:

    df2 <- do.call("cbind",df1)
    

    如果你有不同行数的数据框,试试这个:

    df1 <- lapply(df1, function(x,n){if(nrow(x)<n){x[n,]<-NA};return(x)},n = max(sapply(df1,nrow)))
    
    do.call("cbind",df1)
    

    【讨论】:

    • 感谢您提出其他建议。我试了一下,得到了这个错误Error in data.frame(..., check.names = FALSE) : arguments imply differing number of rows: 107, 42, 175, 37, 53, 57, 68, 47, 44, 36, 41, 65, 35, 56, 55, 6, 106, 27, 76, 60, 51, 43, 64, 16, 14, 29, 105, 109, 20, 23, 18
    【解决方案3】:

    我们可以使用pivot_wider

    library(dplyr)
    library(tidyr)
    library(data.table)
    df2 %>% 
        mutate(rn = rowid(column_label)) %>%
        pivot_wider(names_from = column_label, values_from = V1, values_fill = "") %>%
        select(-rn)
    

    -输出

    # A tibble: 5 x 2
    #  Hazt    PPee    
    #  <chr>   <chr>   
    #1 miR-92  "miR-92"
    #2 miR-92  "miR-3" 
    #3 miR-92  ""      
    #4 miR-184 ""      
    #5 miR-184 ""      
    

    数据

    df2 <- structure(list(column_label = c("Hazt", "Hazt", "Hazt", "Hazt", 
    "Hazt", "PPee", "PPee"), V1 = c("miR-92", "miR-92", "miR-92", 
    "miR-184", "miR-184", "miR-92", "miR-3")), class = "data.frame",
    row.names = c(NA, 
    -7L))
    

    【讨论】:

      【解决方案4】:

      在基础 R 中,您可以根据 column_label 列拆分数据,然后通过附加 NAs 创建一个数据框。

      tmp <- split(df2$V1, df2$column_label)
      sapply(tmp, `[`, 1:max(lengths(tmp)))
      
      #         Hazt      PPee    
      #[1,] "miR-92"  "miR-92"
      #[2,] "miR-92"  "miR-3" 
      #[3,] "miR-92"  NA      
      #[4,] "miR-184" NA      
      #[5,] "miR-184" NA      
      

      【讨论】:

        猜你喜欢
        • 2021-10-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-13
        • 2018-02-19
        • 1970-01-01
        相关资源
        最近更新 更多