2011-07-22 11 views
5

Cómo subconjunto un marco de datos para que solo se incluyan las filas que contienen columnas que tienen un valor que aparece una cierta cantidad de veces en otras filas.Cómo filtrar un marco de datos basado en recuentos de categorías

Por ejemplo, si tengo una columna etiquetada como Comida, ¿cómo podría filtrar todas las filas que tienen un alimento que aparece menos de 5 veces en toda la estructura de datos?

+0

Predigo que una solución implicará 'tabla' y'% en% '. – joran

+0

@Joran: Ya, lo primero que hice fue hacer una tabla, simplemente no estaba seguro de cómo conectar eso como una forma de filtrar el marco de datos. –

Respuesta

8

Aquí está un ejemplo rápido:

dat <- data.frame(x=runif(50),y=sample(letters,50,replace = TRUE)) 
dat[dat$y %in% names(table(dat$y))[table(dat$y) > 2],] 

que selecciona todas las filas que contienen una letra que aparece más de dos veces.

+0

¿Acabas de predecir tu propia respuesta? ¿Y eso cuenta como una verdadera previsión? Voy a votar de todos modos, porque tu respuesta es simple y funciona. – Seth

+1

@Seth - Estoy esperando para regresar a un avión, así que comencé con un comentario, pensando que no tendría tiempo para más. Pero luego pareció que tenía unos minutos, así que escribí la respuesta ... en este momento predigo que tendré un día muy largo en los aeropuertos. :( – joran

+0

Funciona, la única advertencia en mi caso (que no mencioné) fue que, dado que este es un factor, el diagrama de caja todavía muestra todos los niveles a lo largo del eje X, en lugar de solo los que tienen valores. –

1

Soy fan de ave por problemas como este. Utilizando los datos del ejemplo de la respuesta de @ Joran:

set.seed(21) 
dat <- data.frame(x=runif(50), y=sample(letters,50,replace=TRUE)) 
foo <- dat[dat$y %in% names(table(dat$y))[table(dat$y) > 2],] 
bar <- subset(dat, ave(rep(1,nrow(dat)), dat$y, FUN=sum) > 2) 
identical(foo,bar) 
# [1] TRUE 
6

Aquí es otro enfoque (probablemente más limpia) usando plyr.

ddply(dat, .(y), subset, length(x) > 2) 
Cuestiones relacionadas