【问题标题】:Combine character columns into new column将字符列组合成新列
【发布时间】:2014-07-11 04:22:58
【问题描述】:

如果您能在以下方面帮助我,我将不胜感激,因为经过几次测试,我仍然无法获得正确的结果。

我有这些数据:

dd_1 <- data.frame(ID = c("1","2", "3", "4", "5"),
                 Class_a = c("a",NA, "a", NA, NA),
                 Class_b = c(NA, "b", "b", "b", "b"))

我想创建一个新列'CLASS':

dd_2 <- data.frame(ID = c("1","2", "3", "4", "5"),
                 Class_a = c("a",NA, "a", NA, NA),
                 Class_b = c(NA, "b", "b", "b", "b"),
                 CLASS = c("a", "b", "a-b", "b", "b"))

非常感谢!

【问题讨论】:

    标签: r merge dataframe concatenation


    【解决方案1】:

    这里是:

    tmp <- paste(dd_1$Class_a, dd_1$Class_b, sep='-')
    tmp <- gsub('NA-|-NA', '', tmp)
    (dd_2 <- cbind(dd_1, tmp))
    

    首先我们连接(作为字符串连接)2 列。 pasteNAs 视为普通字符串,即"NA",所以我们要么得到NA-a,要么得到NA-b,要么得到a-b。然后我们用空字符串替换NA--NA

    结果:

    ##   ID Class_a Class_b tmp
    ## 1  1       a    <NA>   a
    ## 2  2    <NA>       b   b
    ## 3  3       a       b a-b
    ## 4  4    <NA>       b   b
    ## 5  5    <NA>       b   b
    

    【讨论】:

      【解决方案2】:

      另一种选择:

      dd_1$CLASS <- with(dd_1, ifelse(is.na(Class_a), as.character(Class_b),
                                     ifelse(is.na(Class_b), as.character(Class_a), 
                                              paste(Class_a, Class_b, sep="-"))))
      

      这样,您将检查是否有任何类是 NA 并返回另一个,或者,如果没有一个是 NA,则返回以“-”分隔的两个类。

      【讨论】:

        【解决方案3】:

        这是apply 的简短解决方案:

        dd_2 <- cbind(dd_1, CLASS = apply(dd_1[2:3], 1, 
                                          function(x) paste(na.omit(x), collapse = "-")))
        

        结果

          ID Class_a Class_b CLASS
        1  1       a    <NA>     a
        2  2    <NA>       b     b
        3  3       a       b   a-b
        4  4    <NA>       b     b
        5  5    <NA>       b     b
        

        【讨论】:

          猜你喜欢
          • 2017-11-23
          • 1970-01-01
          • 2020-06-14
          • 1970-01-01
          • 1970-01-01
          • 2017-09-16
          • 1970-01-01
          • 1970-01-01
          • 2020-09-30
          相关资源
          最近更新 更多