Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 根据每行中缺少的值选择列_R_Dplyr - Fatal编程技术网

R 根据每行中缺少的值选择列

R 根据每行中缺少的值选择列,r,dplyr,R,Dplyr,我想知道(对于每一行),我的数据中的任何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)) 我想创建缺少的列: var_1 var_2 var_3 missing_col 1 NA 4 NA "va

我想知道(对于每一行),我的数据中的任何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))
我想创建缺少的列:

  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()
如能提供有关适当功能的任何指导,我们将不胜感激。

您可以尝试以下方法:

#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   
#一个tible:5 x 4
变量1变量2变量3缺少列
1 NA 4 NA变量1,变量3
2 4 5纳瓦鲁3
3 5 6纳瓦鲁3
4673NA
5785NA
>数据%>%
+mutate(缺少_col=apply(,1,函数(x),即.na(x)))%>%
+map_chr(,函数(x)if_else(长度(x)=0,
+“不适用”,
+粘贴(名称(x),折叠=“,”))
#一个tibble:5x4
变量1变量2变量3缺少列
1 NA 4 NA变量1,变量3
2 4 5纳瓦鲁3
3 5 6纳瓦鲁3
4673NA
5785NA

这不是一种整洁的方式,但应用程序似乎足够简单:

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))

data$missing = apply(data,1,function(x) names(x)[is.na(x)])
哪些产出:

data
# A tibble: 5 x 4
  var_1 var_2 var_3 missing  
  <dbl> <dbl> <dbl> <list>   
1 NA     4.00 NA    <chr [2]>
2  4.00  5.00 NA    <chr [1]>
3  5.00  6.00 NA    <chr [1]>
4  6.00  7.00  3.00 <chr [0]>
5  7.00  8.00  5.00 <chr [0]>

一种可能的解决方案是在mutate中直接使用
apply
,而不是
rowwise
。也许可以采用与行方式等效的方法,但我对该函数的经验有限。第二个
mutate
仅当您需要
NA
用于没有
NA
的行时才需要

data %>% 
  mutate(missing_col = apply(., 1, function(x) names(.)[is.na(x)] %>% paste(collapse = ", "))) %>% 
  mutate(missing_col = if_else(missing_col == "", NA_character_, missing_col))

如果我运行它,我最终得到一个TIBLE,它在新列中不显示实际的列名--只显示“”,而打印出来时它不显示数据,您将能够访问缺少的列中的每个值,而这里的一些其他答案将它们组合成一个字符串,这将很难处理。这非常有帮助,因为我需要物品的数量。谢谢你,利奥!
data$missing[[1]]
[1] "var_1" "var_3"
data$missing[[1]][1]
[1] "var_1"
data %>% 
  mutate(missing_col = apply(., 1, function(x) names(.)[is.na(x)] %>% paste(collapse = ", "))) %>% 
  mutate(missing_col = if_else(missing_col == "", NA_character_, missing_col))