r subset r-faq

Eliminar grupos con menos de tres observaciones únicas



subset r-faq (3)

Me gustaría subconjugar mi marco de datos para mantener solo grupos que tengan 3 o más observaciones en DIFERENTES días. Quiero deshacerme de los grupos que tienen menos de 3 observaciones, o las observaciones que tienen no son de 3 días diferentes.

Aquí hay un conjunto de datos de muestra:

Group Day 1 1 1 3 1 5 1 5 2 2 2 2 2 4 2 4 3 1 3 2 3 3 4 1 4 5

Entonces, para el ejemplo anterior, el grupo 1 y el grupo 3 se mantendrán y los grupos 2 y 4 se eliminarán del marco de datos.

Espero que esto tenga sentido, imagino que la solución será bastante simple, pero no puedo resolverlo (soy bastante nuevo en R y no soy muy rápido para encontrar soluciones a cosas como esta). Pensé que tal vez la función diff podría ser útil, pero no llegó mucho más lejos.


Con data.table podrías hacer:

library(data.table) DT[, if(uniqueN(Day) >= 3) .SD, by = Group]

lo que da:

Group Day 1: 1 1 2: 1 3 3: 1 5 4: 1 5 5: 3 1 6: 3 2 7: 3 3

O con dplyr :

library(dplyr) DT %>% group_by(Group) %>% filter(n_distinct(Day) >= 3)

lo que da el mismo resultado.


Podemos usar la base R

i1 <- rowSums(table(df1)!=0)>=3 subset(df1, Group %in% names(i1)[i1]) # Group Day #1 1 1 #2 1 3 #3 1 5 #4 1 5 #9 3 1 #10 3 2 #11 3 3

O una base R una línea base R sería

df1[with(df1, as.logical(ave(Day, Group, FUN = function(x) length(unique(x)) >=3))),]


Una idea usando dplyr

library(dplyr) df %>% group_by(Group) %>% filter(length(unique(Day)) >= 3) #Source: local data frame [7 x 2] #Groups: Group [2] # Group Day # (int) (int) #1 1 1 #2 1 3 #3 1 5 #4 1 5 #5 3 1 #6 3 2 #7 3 3