eliminar identificaciones que ocurren x veces R

Tengo un df y me gustaría eliminar personas que tienen menos de X cantidad de filas en df. Por ejemplo, en este ejemplo de juguete, me gustaría retener personas que tengan> = 5 filas.

df names fruit 4 john kiwi 7 john apple 9 john banana 13 john orange 14 john apple 2 mary orange 5 mary apple 8 mary orange 10 mary apple 12 mary apple 1 tom apple 3 tom banana 6 tom apple 11 tom kiwi 

ejemplo de salida

 df names fruit 4 john kiwi 7 john apple 9 john banana 13 john orange 14 john apple 2 mary orange 5 mary apple 8 mary orange 10 mary apple 12 mary apple 

¡Gracias por adelantado!

Puedes usar una table como esta:

 df[df$names %in% names(table(df$names))[table(df$names) >= 5],] 

Aquí hay una solución data.table usando el valor .N integrado, que es como se describe en el archivo de ayuda de '.N' is an integer, length 1, containing the number of rows in the group. : '.N' is an integer, length 1, containing the number of rows in the group.

 #create a similar reproducible exmaple library(data.table) dat < - data.table(names=rep(letters[1:3],c(5,5,3)),var=1:13) 

Eliminar las filas:

 dat[, cnt:=.N, by=names][cnt >= 5] 

Aunque siento que debe haber una manera de hacer esto sin asignar una nueva variable. ... Y ahora hay gracias a @mnel en los comentarios:

 dat[,if(.N>=5).SD,by=names] 

Esto devuelve esencialmente un .SD .SD para cada valor del grupo by si el número de filas en el grupo .N es mayor o igual que 5. Es prácticamente equivalente a la syntax de subconjunto R más tradicional de:

 dat[,.SD[.N >= 5],by=names]