0
votes

Comment filtrer les données tant que un groupe contient certaines valeurs?

J'ai une donnée de données comme ceci:

VisitID | Item |
1       | A    |
1       | B    |
1       | C    |
1       | D    |
2       | A    |
2       | D    |
2       | B    |
3       | B    |
3       | C    |


0 commentaires

4 Réponses :


2
votes

Nous pouvons sélectionner des groupes où tout code> (code> a 'a' code> ou 'b' code>. xxx pré>

ou dans la base R: p> xxx pré>

et dans datable.table code> p>

df <- structure(list(VisitID = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 
4L, 4L), Item = structure(c(1L, 2L, 3L, 4L, 1L, 4L, 2L, 2L, 3L, 
4L, 3L), .Label = c("A", "B", "C", "D"), class = "factor")), 
row.names = c(NA, -11L), class = "data.frame")


6 commentaires

Il semble que vous obtenez également des articles avec «C» et «D» dans votre DLIPR Approche. Avez-vous voulu dire filtre (article% en% C ('A', 'B')) ? Vous ne voulez pas en fait utiliser aucun ici puisqu'il renvoie true pour tous (à partir de l'aide "donnée à un ensemble de vecteurs logiques, c'est au moins une des valeurs vraies?").


@CBO Il est en ligne avec la sortie attendue de l'OP. Si je les ai compris correctement. Sélectionnez des groupes si "A" ou "B" est en groupe.


Je pense également qu'il est utile d'utiliser dplyr :: filtre plutôt que filtrer, car "filtrer" est une fonction dans le package STATS dans R, de sorte qu'il peut s'affronter et provoquer des messages d'erreur déroutants


@sahwahn après Bibliothèque (dplyr) , Filtre sera masqué à partir de Stat . Utiliser :: pourrait être redondant.


J'ai peut-être des paramètres différents dans mon .RProfile à propos de masquer différentes bibliothèques, mais à l'aide de la bibliothèque (dplyr), puis d'appeler le filtre renvoie toujours le filtre à partir du package STATS.


@Ronakshah mon mauvais, j'ai lu trop vite ^^ ' tout est requis ici.



4
votes

dans la base R, je ferais:

df <- data.frame(VisitID = c(1,1,1,1,2,2,2,3,3,4,4), 
                 Item = c("A", "B", "C", "D", "A", "D", "B", "B", "C", "D", "C"))

do.call("rbind", lapply(split(df, df$VisitID), function(x) if(any(x[,2] %in% c("A", "B"))) x else NULL))

# VisitID Item
# 1.1       1    A
# 1.2       1    B
# 1.3       1    C
# 1.4       1    D
# 2.5       2    A
# 2.6       2    D
# 2.7       2    B
# 3.8       3    B
# 3.9       3    C


0 commentaires

2
votes

Une autre condition de filtrage sans regrouper les données: xxx


0 commentaires

1
votes

Un autre Solution Code> Solution :.

groups <- rowsum(x = as.numeric( df$Item %in% c("A", "B") ), group = df$VisitID)
df[df$VisitID %in% rownames(groups)[groups > 0] , ]


0 commentaires