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!
3 Réponses :
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
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(.))))
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
Ce n'est pas une réponse.