Подсчет NAs по строкам из нескольких переменных, представленных в виде вектора - PullRequest
1 голос
/ 17 июня 2020

У меня есть данные:

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) какие-либо NA s?

Ожидаемый ответ для colset1 - TRUE FALSE TRUE FALSE FALSE, а для colset2 - FALSE FALSE TRUE TRUE FALSE (лучше всего, если его можно изменить как новую логическую переменную, не имеет значения).

Альтернативный вопрос: как подсчитать NA s в этих столбцах? Ожидаемый ответ для colset1 - 0 1 0 1 2, а для colset2 - 1 2 0 0 1

Я пытался изменить ...ifelse(length(sum(is.na(vars(colset1)))) == 0), но чего-то все еще не хватало, это не сработало, и я потерялся в собственный код :)

Спасибо!

Ответы [ 3 ]

1 голос
/ 17 июня 2020

Одно 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
1 голос
/ 17 июня 2020

Не нужно 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
0 голосов
/ 17 июня 2020
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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...