2

我有一个数据:

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),但仍然缺少一些东西,它不起作用,我迷失在自己的代码中:)

谢谢!

4

3 回答 3

2

一种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
于 2020-06-17T09:14:31.297 回答
1

不需要dplyr。你可以简单地使用rowSums,即

!rowSums(is.na(test_df[colset1])) > 0
#[1]  TRUE FALSE  TRUE FALSE FALSE

!rowSums(is.na(test_df[colset2])) > 0
#[1] FALSE FALSE  TRUE  TRUE FALSE

要获得实际的 NA 数量,您可以删除逻辑> 0符号和否定符号 ( !),即

rowSums(is.na(test_df[colset1]))
#[1] 0 1 0 1 2
rowSums(is.na(test_df[colset2]))
#[1] 1 2 0 0 1
于 2020-06-17T09:12:45.317 回答
-2
test_df
    x1 x2    x3 x4
1    a  4  TRUE NA
2    b  3    NA NA
3    c  2 FALSE  1
4   NA  5  TRUE  2
5   NA  1    NA  3
is_na(test_df)
        x1    x2    x3    x4
[1,] FALSE FALSE FALSE  TRUE
[2,] FALSE FALSE  TRUE  TRUE
[3,] FALSE FALSE FALSE FALSE
[4,]  TRUE FALSE FALSE FALSE
[5,]  TRUE FALSE  TRUE FALSE

使用 na.tools 包

于 2020-06-17T09:21:34.527 回答