首页 > 解决方案 > 如何查找多列中的每一行是否有NA?

问题描述

我在 R 中有这个数据框

df <- structure(list(S.No = c(1L, 2L, 3L, 8L, 5L, 6L), A = c(8L, 8L, 
5L, 2L, NA, 3L), B = c(5L, 8L, 8L, 2L, NA, 3L), C = c("8", "test", 
"error", "3", NA, "3"), D = c(5L, 5L, 3L, 3L, NA, 8L), E = c("test", 
"8", "8", "error", NA, "3")), class = "data.frame", row.names = c(NA, 
-6L))

我需要确定每行的所有列值是否都有 NA。它需要按行排列,但我无法让它工作。这是我迄今为止尝试过的

test.vars = c("A","B","C","D","E")

df %>% mutate(null_message = as.numeric(is.na(rowSums(.[test.vars]))))

如果我的列只有数值,则此方法有效。所以,我尝试做其他事情:

df %>% mutate(null_message = any(is.na((.[test.vars]))))

但这不起作用。它将所有行显示为TRUE,我知道为什么。我可以使用|,但这样做似乎有点乏味is.na(A) | is.na(B) | is.na(C) | ... 。有没有办法可以有效地完成这项工作?

预期的输出如下:

在此处输入图像描述

标签: rdplyr

解决方案


你在正确的道路上:

library(dplyr)
test.vars = c("A","B","C","D","E")

df %>% mutate(null_message = as.numeric(rowSums(is.na(.[test.vars])) == length(test.vars)))

#  S.No  A  B     C  D     E null_message
#1    1  8  5     8  5  test            0
#2    2  8  8  test  5     8            0
#3    3  5  8 error  3     8            0
#4    8  2  2     3  3 error            0
#5    5 NA NA  <NA> NA  <NA>            1
#6    6  3  3     3  8     3            0

NA如果行中的值的数量与 相同,则这将读取分配 1 length(test.vars)

或以其他方式:

df %>% mutate(null_message = as.numeric(rowSums(!is.na(.[test.vars])) == 0))

NA如果该行中非值的数量为 0,则这将读取分配 1 。


推荐阅读