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