首页 > 解决方案 > 从作为向量提供的多个变量中逐行计算 NA

问题描述

我有一个数据:

test_df <- data.frame(x1 = c("a", "b", "c", NA, NA), 
                      x2 = sample(1:5),
                      x3 = c(T, NA, F, T, NA),
                      x4 = c(NA, NA, 1, 2, 3),
                      stringsAsFactors = F)

colset1 <- c("x1", "x2", "x3")
colset2 <- c("x2", "x3", "x4")

包含变量名称的数据框和向量。

如何检查(最好的dplyr方式),如果向量()中提供的任何列行colset包含任何NAs?

colset1isTRUE FALSE TRUE FALSE FALSE和 for colset2is的预期答案FALSE FALSE TRUE TRUE FALSE(最好是可以变异为新的逻辑变量,没关系)。

另一个问题是:如何计算NA那些列中的 s?colset1is0 1 0 1 2和 for colset2is的预期答案1 2 0 0 1

我正在尝试变异...ifelse(length(sum(is.na(vars(colset1)))) == 0),但仍然缺少一些东西,它不起作用,我迷失在自己的代码中:)

谢谢!

标签: rdataframedplyrrowwise

解决方案


一种dplyr解决方案可能是:

test_df %>%
 mutate(colset1 = Reduce(`|`, across(colset1, ~ is.na(.))),
        colset2 = Reduce(`|`, across(colset2, ~ is.na(.))))

要获得计数:

test_df %>%
 mutate(colset1 = rowSums(across(colset1, ~ is.na(.))),
        colset2 = rowSums(across(colset2, ~ is.na(.))))

    x1 x2    x3 x4 colset1 colset2
1    a  3  TRUE NA       0       1
2    b  4    NA NA       1       2
3    c  1 FALSE  1       0       0
4 <NA>  5  TRUE  2       1       0
5 <NA>  2    NA  3       2       1

推荐阅读