为 R 中数据框的每一行返回缺少 (NA) 数据的列名列表

And*_*rew 2 r na dplyr

我正在尝试为数据框中的每个 ID# 创建一个带有 NA 值的数据列表,以便我可以跟踪丢失的数据。我有一个数据框,其中每一行都是一个 ID#,每一列都是一个变量名。每个 ID# 可能有不同的缺失数据,因此我想将此信息压缩到一个两列表中。目前,我的表看起来像这样:

ID  Var1 Var2 Var3 Var4 Var5
1   10   T    NA   2    NA
2   15   F    50   2    NA
3   12   NA   41   2    NA
4   NA   NA   NA   1    NA
5   NA   F    NA   NA   NA
...
Run Code Online (Sandbox Code Playgroud)

我希望得到看起来像这样的输出:

ID   Missing Variables
1    Var3, Var5
2    Var5
3    Var2, Var5
4    Var1, Var2, Var3, Var5
5    Var1, Var3, Var4, Var5
...
Run Code Online (Sandbox Code Playgroud)

我很困惑如何为每个丢失的数据条目返回列名。我知道你可能可以用 for 循环做这样的事情,但除此之外我有点迷失了。任何帮助深表感谢!

Ben*_*ris 6

这是一个tidyverse解决方案。

df <- read_table("
ID  Var1 Var2 Var3 Var4 Var5
1   10   T    NA   2    NA
2   15   F    50   2    NA
3   12   NA   41   2    NA
4   NA   NA   NA   1    NA
5   NA   F    NA   NA   NA", col_names = TRUE)

library(dplyr)
library(tidyr)
df %>%
  mutate(across(starts_with("var"), is.na)) %>%  # replace all NA with TRUE and else FALSE
  pivot_longer(-ID, names_to = "var") %>%  # pivot longer
  filter(value) %>%   # remove the FALSE rows
  group_by(ID) %>%    # group by the ID
  summarise(`Missing Variables` = toString(var)) # convert the variable names to a string column

`summarise()` ungrouping output (override with `.groups` argument)
# A tibble: 5 x 2
     ID `Missing Variables`   
  <dbl> <chr>                 
1     1 Var3, Var5            
2     2 Var5                  
3     3 Var2, Var5            
4     4 Var1, Var2, Var3, Var5
5     5 Var1, Var3, Var4, Var5
Run Code Online (Sandbox Code Playgroud)