【问题标题】:merge multiple columns in one table?在一个表中合并多个列?
【发布时间】:2019-08-13 12:22:35
【问题描述】:

我有一个包含几列的表,我想通过在一个表中组合“R1、R2 和 R3”列来创建一个列。

DF:

 ID      R1  T1  R2  T2  R3  T3
rs1     A    1  NA   .  NA  0
rs21    NA   0  C    1   C  1 
rs32    A    1  A    1   A  0
rs25    NA   2  NA   0   A  0

期望的输出:

ID      R1  T1  R2  T2  R3  T3    New_R
rs1     A    1  NA   .  NA  0      A
rs21    NA   0  C    1   C  1      C
rs32    A    1  A    1   A  0      A
rs25    NA   2  NA   0   A  0      A

【问题讨论】:

    标签: r join merge


    【解决方案1】:

    我们可以使用tidyverse

    library(tidyverse)
    DF %>% 
         mutate(New_R = pmap_chr(select(., starts_with("R")),  ~c(...) %>% 
                                                        na.omit %>%
                               unique %>%
                               str_c(collape="")))
    #.  ID   R1 T1   R2 T2   R3 T3 New_R
    #1  rs1    A  1 <NA>  . <NA>  0     A
    #2 rs21 <NA>  0    C  1    C  1     C
    #3 rs32    A  1    A  1    A  0     A
    #4 rs25 <NA>  2 <NA>  0    A  0     A
    

    如果每行只有一个非NA元素,我们可以使用coalecse

    DF %>% 
          mutate(New_R = coalesce(!!! select(., starts_with("R"))))
    

    或在base R

    DF$New_R <- do.call(pmin, c(DF[grep("^R\\d+", names(DF))], na.rm = TRUE))
    

    数据

    DF <- structure(list(ID = c("rs1", "rs21", "rs32", "rs25"), R1 = c("A", 
    NA, "A", NA), T1 = c(1L, 0L, 1L, 2L), R2 = c(NA, "C", "A", NA
    ), T2 = c(".", "1", "1", "0"), R3 = c(NA, "C", "A", "A"), T3 = c(0L, 
    1L, 0L, 0L)), class = "data.frame", row.names = c(NA, -4L))
    

    【讨论】:

      【解决方案2】:

      您可以嵌套使用ifelse 函数:

      DF$New_R <- ifelse(!is.na(DF$R1), DF$R1, 
                  ifelse(!is.na(DF$R2), DF$R2, 
                  ifelse(!is.na(DF$R3), DF$R3, NA)))
      

      ifelse 接受三个参数,一个条件,如果条件满足怎么办,如果条件不满足怎么办。它可以应用于分别处理每个原始数据的数据框列。在我的示例中,它将选择找到的第一个非 NA 值。

      【讨论】:

        【解决方案3】:

        我们可以逐行使用apply,删除NA 值并仅保留unique 值。

        cols <- paste0("R", 1:3)
        df$New_R <- apply(df[cols], 1, function(x) 
                      paste0(unique(na.omit(x)), collapse = ""))
        
        df
        #    ID   R1 T1   R2 T2   R3 T3 New_R
        #1  rs1    A  1 <NA>  . <NA>  0     A
        #2 rs21 <NA>  0    C  1    C  1     C
        #3 rs32    A  1    A  1    A  0     A
        #4 rs25 <NA>  2 <NA>  0    A  0     A
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-01-07
          • 1970-01-01
          • 2017-12-30
          • 2021-06-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多