How do I subset a dataframe so that only rows that contain columns that have a value that shows up a certain amount of times in other rows are included.
For example, if I have a column labeled Food, how would I filter out all rows that have a food that shows u开发者_C百科p less than 5 times in the whole dataframe?
Here's a quick example:
dat <- data.frame(x=runif(50),y=sample(letters,50,replace = TRUE))
dat[dat$y %in% names(table(dat$y))[table(dat$y) > 2],]
That selects all rows that contain a letter that appears more than twice.
Here is another approach (probably cleaner) using plyr
.
ddply(dat, .(y), subset, length(x) > 2)
I'm a fan of ave
for problems like this. Using the example data from @joran's answer:
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
精彩评论