1
votes

Compter les NA par ligne à partir de plusieurs variables fournies en tant que vecteur

J'ai un data:

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")

data frame et vecteurs contenant des noms de variables.

Comment vérifier (au mieux de la manière dplyr ), si une ligne de colonnes fournie dans un vecteur ( colset ) contient un NA s?

La réponse attendue pour colset1 est TRUE FALSE TRUE FALSE FALSE et pour colset2 est FALSE FALSE TRUE TRUE FALSE (mieux si peut être muté en tant que nouvelle variable logique, peu importe).

La question alternative sera: comment compter les NA dans ces colonnes? La réponse attendue pour colset1 est 0 1 0 1 2 et pour colset2 est 1 2 0 0 1 p>

J'essayais de muter ... ifelse (length (sum (is.na (vars (colset1)))) == 0) mais quelque chose manquait toujours, il ne l'a pas fait ' t travail et je me suis perdu dans mon propre code :)

Merci!


0 commentaires

3 Réponses :


1
votes

Pas besoin de dplyr . Vous pouvez simplement utiliser rowSums , c'est-à-dire

rowSums(is.na(test_df[colset1]))
#[1] 0 1 0 1 2
rowSums(is.na(test_df[colset2]))
#[1] 1 2 0 0 1

Pour obtenir le nombre réel de NA, vous pouvez supprimer le > 0 logique et le negate symbole (! ), c'est-à-dire

!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


0 commentaires

1
votes

Une solution dplyr pourrait être:

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

Pour obtenir les décomptes:

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


0 commentaires

-2
votes
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
Use na.tools package

1 commentaires

Ce n'est pas une réponse.