【问题标题】:List reformating in R [duplicate]R中的列表重新格式化[重复]
【发布时间】:2016-07-15 18:29:29
【问题描述】:

我有这个 df:

   KEGGnumber         Cor             Colors
X1 C00095            -2.623973e-01    RED
X2 C17714, C00044    -2.241113e-01    RED
X3 C00033            -3.066684e-01    RED

并希望将其格式化为两列数据框,每个 KEGGnumber 与其Color 匹配。它看起来像这样:

KEGGnumber  Colors
C00095      RED
C17714      RED
C00044      RED
C00033      RED

本质上,新数据帧采用具有多个KEGGnumber 的旧数据帧的行并将它们拆分,同时为每个保持相同的Color

【问题讨论】:

    标签: r list dataframe formatting


    【解决方案1】:

    tidyr 让这很容易:

    library(tidyr)
    
    df %>% separate_rows(KEGGnumber)
    ##          Cor Colors KEGGnumber
    ## 1 -0.2623973    RED     C00095
    ## 2 -0.2241113    RED     C17714
    ## 3 -0.2241113    RED     C00044
    ## 4 -0.3066684    RED     C00033
    

    如果你愿意,可以去掉 Cor 列。

    一个不太漂亮的基本选项:

    do.call(rbind, 
            Map(function(x, y){data.frame(KEGGnumber = x, Colors = y)}, 
                strsplit(as.character(df$KEGGnumber), ', '), 
                df$Colors))
    ##   KEGGnumber Colors
    ## 1     C00095    RED
    ## 2     C17714    RED
    ## 3     C00044    RED
    ## 4     C00033    RED
    

    【讨论】:

      【解决方案2】:

      这可能是重复的,也可能不是重复的,但可以在这里找到一个非常相似的问题:Splitting a string into new rows in R

      此示例对您的案例的简单改编是:

      library(splitstackshape)
      library(data.table)
      df2 <- as.data.frame(cSplit(as.data.frame(ls), "KEGGnumber",
                                           sep = ",", direction = "long"))
      
      df2
        KEGGnumber        Cor Colors
      1     c00095 -0.2623973    RED
      2     c17714 -0.2241113    RED
      3     c00044 -0.2241113    RED
      4     c00033 -0.3066684    RED
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-05-02
        • 1970-01-01
        • 1970-01-01
        • 2016-08-20
        • 2020-08-28
        • 2020-10-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多