J'ai de longues données où un sujet donné a 4 observations. Je souhaite inclure uniquement un identifiant donné qui remplit les conditions suivantes:
a au moins un 3
a au moins un des 1,2 OU NA
Ma structure de données:
df %>% dplyr::group_by(id) %>% filter(a==3 & a %in% c(1,2,NA))
Ma tentative infructueuse (j'obtiens un bloc de données vide):
df <- data.frame(id=c(1,1,1,1,2,2,2,2,3,3,3,3), a=c(NA,1,2,3, NA,3,2,0, NA,NA,1,1))
3 Réponses :
Une option consiste à grouper par 'id', créer une logique pour renvoyer un seul TRUE / FALSE en sortie. Sur la base de la publication du PO, nous avons besoin des deux valeurs «3» et de l'une des valeurs 1, 2, NA dans la colonne «a». Ainsi, 3% in% a
renvoie un vecteur logique de longueur 1, puis encapsule any
sur le deuxième ensemble où nous faisons une comparaison avec plusieurs valeurs ou vérifions les éléments NA ( is.na
), fusionnez les deux sorties logiques avec &
library(dplyr) df %>% group_by(id) %>% filter((3 %in% a) & any(c(1, 2) %in% a|is.na(a)) ) # A tibble: 8 x 2 # Groups: id [2] # id a # <dbl> <dbl> #1 1 NA #2 1 1 #3 1 2 #4 1 3 #5 2 NA #6 2 3 #7 2 2 #8 2 0
J'ai fait un peu de chemin pour montrer comment une idée pouvait fonctionner. Vous pouvez consolider cela un peu.
df %>% group_by(id) %>% mutate(has_3 = sum(a == 3, na.rm = T) > 0, keep_me = has_3 & (sum(is.na(a)) > 0 | sum(a %in% c(1, 2)) > 0)) %>% filter(keep_me == TRUE) %>% select(id, a) id a <dbl> <dbl> 1 1 NA 2 1 1 3 1 2 4 1 3 5 2 NA 6 2 3 7 2 2 8 2 0
Tel que je l'ai lu, le filtre devrait garder les identifiants 1 et 2. J'utiliserais donc un combo de tout / tout:
df %>% group_by(id) %>% filter(all(3 %in% a) & any(c(1,2,NA) %in% a))
Il ne peut pas avoir à la fois 3 et 1, 2 ou NA sur la même ligne. pouvez-vous montrer la sortie attendue
veuillez partager le résultat attendu
si vous voulez regrouper et additionner les valeurs par id, faites ceci: df%>% group_by (id)%>% summary (amount = sum (a, na.rm = T))