【问题标题】:Merge two columns maintaning missing values合并两列维护缺失值
【发布时间】:2018-10-17 11:04:21
【问题描述】:

我正在尝试添加两列。我的数据框是这样的:

data <- data.frame(a = c(0,1,NA,0,NA,NA),
                   x = c(NA,NA,NA,NA,1,0),
                   t = c(NA,2,NA,NA,2,0))

我想添加一些这样的列:

yep  <- cbind.data.frame( data$a, data$x, rowSums(data[,c(1, 2)], na.rm = TRUE))

但是输出看起来像这样:

> yep

      data$a  data$x   rowSums(data[,c(1, 2)], na.rm = TRUE)
  1        0      NA                                      0
  2        1      NA                                      1
  3       NA      NA                                      0
  4        0      NA                                      0
  5       NA       1                                      1
  6       NA       0                                      0

我想要这样的输出:

> yep

      data$a  data$x   rowSums(data[,c(1, 2)], na.rm = TRUE)
  1        0      NA                                      0
  2        1      NA                                      1
  3       NA      NA                                      NA
  4        0      NA                                      0
  5       NA       1                                      1
  6       NA       0                                      0

如果列仅包含 NA 值,我想保留 NA 值。

我怎样才能做到这一点?

【问题讨论】:

    标签: r merge rowsum


    【解决方案1】:

    基础R:

    data <- data.frame("a" = c(0,1,NA,0,NA,NA),
                       "x" = c(NA,NA,NA,NA,1,0),
                       "t" = c(NA,2,NA,NA,2,0)
    )
    
    yep <- cbind.data.frame( data$a, data$x, rs = rowSums(data[,c(1, 2)], na.rm = TRUE))
    yep$rs[is.na(data$a) & is.na(data$x)] <- NA
    yep
    

    【讨论】:

      【解决方案2】:

      基础 R (ifelse):

      cbind(data$a,data$x,ifelse(is.na(data$a) & is.na(data$x),NA,rowSums(data[,1:2],na.rm = TRUE)))
      

      如果您要查找列名,请将cbind 替换为cbind.data.frame

      输出:

            [,1] [,2] [,3]
      [1,]    0   NA    0
      [2,]    1   NA    1
      [3,]   NA   NA   NA
      [4,]    0   NA    0
      [5,]   NA    1    1
      [6,]   NA    0    0
      

      【讨论】:

      • 所有答案都有效。这个,也适用于 a = x = 1,这个答案返回 2 而不是 1。markus 的答案非常适合我的例子,如果有人想使用第一个列中的值(在两列中都没有缺失数据的情况)。
      【解决方案3】:

      你可以试试dplyr::coalesce

      cbind.data.frame( data$a, data$x, dplyr::coalesce(data$a, data$x))
      #  data$a data$x dplyr::coalesce(data$a, data$x)
      #1      0     NA                               0
      #2      1     NA                               1
      #3     NA     NA                              NA
      #4      0     NA                               0
      #5     NA      1                               1
      #6     NA      0                               0
      

      【讨论】:

      • 这适用于发布的示例,但它没有得到sum。如果有一行 a = x = 1 它将返回 1 而不是 2
      • @AntoniosK 你当然是对的。鉴于示例数据,我认为 coalesce 将“足够”满足 OP 的需求。
      【解决方案4】:

      基本规则

        data[['rowsum']]<-ifelse(is.na(data$a) & is.na(data$x),NA,ifelse(is.na(data$a),0,data$a)+ifelse(is.na(data$x),0,data$x))
      
           a  x  t rowsum
       1:  0 NA NA      0
       2:  1 NA  2      1
       3: NA NA NA     NA
       4:  0 NA NA      0
       5: NA  1  2      1
       6: NA  0  0      0
      

      【讨论】:

        【解决方案5】:

        另一种基本 R 方法。

        如果行中的所有值都是NA,则返回NA,否则返回忽略NA 的行的总和。

        #Select only the columns which we need
        sub_df <- data[c("a", "x")]
        
        sub_df$answer <- ifelse(rowSums(is.na(sub_df)) == ncol(sub_df), NA, 
                            rowSums(sub_df, na.rm = TRUE))
        
        sub_df
        #   a  x answer
        #1  0 NA      0
        #2  1 NA      1
        #3 NA NA     NA
        #4  0 NA      0
        #5 NA  1      1
        #6 NA  0      0
        

        【讨论】:

          猜你喜欢
          • 2021-12-12
          • 1970-01-01
          • 1970-01-01
          • 2014-07-19
          • 1970-01-01
          • 1970-01-01
          • 2016-01-06
          • 2015-04-12
          • 1970-01-01
          相关资源
          最近更新 更多