【问题标题】:Merging two columns into one in R [duplicate]在R中将两列合并为一列[重复]
【发布时间】:2015-06-20 11:32:55
【问题描述】:

我有以下数据框,我正在尝试将两列合并为一列,同时将 NA 替换为数值。

ID    A     B
1     3     NA
2     NA    2
3     NA    4
4     1     NA

我想要的结果是:

ID    New
1     3
2     2
3     4
4     1

提前致谢!

【问题讨论】:

    标签: r merge


    【解决方案1】:

    写答案时这可能不存在,但由于我带着同样的问题来到这里并找到了更好的解决方案,这里是为未来的谷歌人准备的:

    你想要的是来自dplyrcoalesce() 函数:

    y <- c(1, 2, NA, NA, 5)
    z <- c(NA, NA, 3, 4, 5)
    coalesce(y, z)
    
    [1] 1 2 3 4 5
    

    【讨论】:

      【解决方案2】:

      你也可以这样做:with(d,ifelse(is.na(A),B,A))

      其中d 是您的数据框。

      【讨论】:

      • 仅当 NA 在一个或另一个列中独占时才有效!但这种特殊情况的好方法!
      【解决方案3】:

      您可以从tidyr 使用unite

      library(tidyr)
      
      df[is.na(df)] = ''
      unite(df, new, A:B, sep='')
      #  ID new
      #1  1   3
      #2  2   2
      #3  3   4
      #4  4   1
      

      【讨论】:

      • A:B 可以替换为 1:2 等列索引。
      【解决方案4】:

      在这种情况下,另一个非常简单的解决方案是使用rowSums 函数。

      df$New<-rowSums(df[, c("A", "B")], na.rm=T)
      df<-df[, c("ID", "New")]
      

      更新: 感谢@Artem Klevtsov 提到此方法仅适用于数字数据。

      【讨论】:

      • 还要注意,如果“A”和“B”列都有 NA,那么“新建”中将返回 0。在测试用例中没有问题。
      【解决方案5】:

      你可以试试

      New <- do.call(pmax, c(df1[-1], na.rm=TRUE))
      

      或者

      New <-  df1[-1][cbind(1:nrow(df1),max.col(!is.na(df1[-1])))]
      d1 <- data.frame(ID=df1$ID, New)
      d1
      #  ID New
      #1  1   3
      #2  2   2
      #3  3   4
      #4  4   1
      

      【讨论】:

        【解决方案6】:

        假设 A 或 B 有一个 NA,那就可以了:

        # creating initial data frame (actually data.table in this case)
        library(data.table)
        x<- as.data.table(list(ID = c(1,2,3,4), A = c(3, NA, NA, 1), B = c(NA, 2, 4, NA)))
        x
        #   ID  A  B
        #1:  1  3 NA
        #2:  2 NA  2
        #3:  3 NA  4
        #4:  4  1 NA
        
        
        #solution
        y[,New := na.omit(c(A,B)), by = ID][,c("A","B"):=NULL]
        y
        #   ID New
        #1:  1   3
        #2:  2   2
        #3:  3   4
        #4:  4   1
        

        【讨论】:

        • 不错!另外,y[, New := pmin(A, B, na.rm=TRUE)]
        【解决方案7】:

        这个问题已经存在了一段时间,但只是为了添加另一种不依赖任何库的可能方法:

        df$new = t(df[-1])[!is.na(t(df[-1]))]
        
        #   ID  A  B new
        # 1  1  3 NA   3
        # 2  2 NA  2   2
        # 3  3 NA  4   4
        # 4  4  1 NA   1
        

        【讨论】:

          猜你喜欢
          • 2021-01-23
          • 1970-01-01
          • 2021-11-27
          • 2022-10-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多