【问题标题】:R: Combine columns ignoring NAsR:合并列忽略 NA
【发布时间】:2018-04-18 00:32:41
【问题描述】:

我有一个包含几列的数据框,其中每一行只有一列可以具有非 NA 值。我想将列合并为一个,只保留非 NA 值,类似于这篇文章:

Combine column to remove NA's

但是,就我而言,某些行可能只包含 NA,因此在组合列中,我们应该保留一个 NA,如下所示(改编自我提到的帖子):

data <- data.frame('a' = c('A','B','C','D','E','F'),
                   'x' = c(1,2,NA,NA,NA,NA),
                   'y' = c(NA,NA,3,NA,NA,NA),
                   'z' = c(NA,NA,NA,4,5,NA))

所以我会的

  a  x  y  z
1 A  1 NA NA
2 B  2 NA NA
3 C NA  3 NA
4 D NA NA  4
5 E NA NA  5
6 F NA NA NA

我想得到

 'a' 'mycol'  
  A   1  
  B   2  
  C   3  
  D   4  
  E   5  
  F   NA

由于 F 行,上述帖子中的解决方案在我的情况下不起作用,它是:

cbind(data[1], mycol = na.omit(unlist(data[-1])))

谢谢!

【问题讨论】:

    标签: r


    【解决方案1】:

    使用基础 R...

    data$mycol <- apply(data[,2:4], 1, function(x) x[!is.na(x)][1])
    
    data
      a  x  y  z mycol
    1 A  1 NA NA     1
    2 B  2 NA NA     2
    3 C NA  3 NA     3
    4 D NA NA  4     4
    5 E NA NA  5     5
    6 F NA NA NA    NA
    

    【讨论】:

      【解决方案2】:

      一个选项是coalesce 来自dplyr

      library(tidyverse)
      data %>% 
         transmute(a, mycol = coalesce(!!! rlang::syms(names(.)[-1])))
      #    a mycol
      #1 A     1
      #2 B     2
      #3 C     3
      #4 D     4
      #5 E     5
      #6 F    NA
      

      或者我们可以使用来自base Rmax.col

      cbind(data[1], mycol= data[-1][cbind(1:nrow(data), 
             max.col(!is.na(data[-1])) * NA^!rowSums(!is.na(data[-1]))+1)])
      #   a mycol
      #1 A     1
      #2 B     2
      #3 C     3
      #4 D     4
      #5 E     5
      #6 F    NA
      

      或仅使用rowSums

      v1 <- rowSums(data[-1], na.rm = TRUE)
      cbind(data[1], mycol = v1 * NA^!v1)
      

      或者另一个选项是pmax

      cbind(data[1], mycol = do.call(pmax, c(data[-1], na.rm = TRUE)))
      

      pmin

      cbind(data[1], mycol = do.call(pmin, c(data[-1], na.rm = TRUE)))
      

      【讨论】:

      • 你能指定你使用哪个包来实现 syms 功能吗?我看到不同的包具有相同名称的功能。
      猜你喜欢
      • 1970-01-01
      • 2017-10-25
      • 2017-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-02
      相关资源
      最近更新 更多