首页 > 解决方案 > 根据每行中的缺失值选择列

问题描述

我想知道(对于每一行)我的数据中的任何 NA 属于哪些列。目标是创建一个新的列/变量,列出数据显示为 NA 的列的名称,对于该特定行,最好使用 dplyr。

使用这个模拟数据,

data = tibble(var_1 = c(NA, 4, 5, 6, 7), var_2 = c(4, 5, 6, 7, 8), var_3 = c(NA, NA, NA, 3, 5))

我想创建 missing_col 列:

  var_1 var_2 var_3       missing_col
1    NA     4    NA  "var_1", "var_3"             
2     4     5    NA           "var_3"
3     5     6    NA           "var_3"
4     6     7     3                NA
5     7     8     5                NA

到目前为止,我的方法是将 rowwise() 函数与 mutate 以及嵌套的 select_if() 和函数结合使用。但是,到目前为止,我尝试过的所有功能都不允许我单独考虑每一行(而不是整列)。下面我介绍了我的方法的一般结构。

data %>% 
  rowwise() %>%
  mutate(missing_col = select_if(function(x) ... )) %>%
  names()

任何有关适当功能的指导将不胜感激。

标签: rdplyr

解决方案


你可以试试这个:

#Unlist the results from apply
missing_col=unlist(x=apply(X=data, MARGIN=1, FUN=function(x){

  #Get the names of the rows which have NA
  NamesNA=names(which(is.na(x)))

  #If there's no NA then replace the 'character(0)' for NA.
  if(length(NamesNA)!=0){

    #Concatenate names if there are more than one
    paste0(NamesNA, collapse=",")

  }else{

    #Replace 'character(0)'
    NA  

  }
})
)

#Add column with desired output
data$missing_col=missing_col

这给出了所需的输出:

# A tibble: 5 x 4
  var_1 var_2 var_3 missing_col
  <dbl> <dbl> <dbl> <chr>      
1    NA     4    NA var_1,var_3
2     4     5    NA var_3      
3     5     6    NA var_3      
4     6     7     3 NA         
5     7     8     5 NA   

推荐阅读