Tengo una df como esta:

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

En R, ¿cómo filtro para los ID de visita siempre que contengan los elementos A y B? Gastos esperados:

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

Intenté df %>% group_by(VisitID) %>% filter(any(Item == 'A' & Item == 'B')) pero no funciona ...

df <- read_delim("ID | Item 
1  | A    
1  | B    
2  | A    
3  | B    
1  | C    
4  | C    
5  | B    
3  | A    
4  | A    
5  | D", delim = "|", trim_ws = TRUE)
0
spidermarn 2 jun. 2020 a las 08:52

2 respuestas

La mejor respuesta

Como desea tanto "A" como "B", puede usar all

library(dplyr)
df %>% group_by(VisitID) %>% filter(all(c("A", "B") %in% Item))

#  VisitID Item 
#    <int> <chr>
#1       1 A    
#2       1 B    
#3       1 C    
#4       1 D    
#5       2 A    
#6       2 D    
#7       2 B    

O si desea utilizar any utilícelos por separado.

df %>% group_by(VisitID) %>% filter(any(Item == 'A') && any(Item == 'B'))
3
MichaelChirico 2 jun. 2020 a las 06:03

Una opción con data.table

library(data.table)
setDT(df)[, .SD[all(c("A", "B") %in% Item)], VisitID]
0
akrun 2 jun. 2020 a las 20:01