【发布时间】:2011-10-11 09:55:10
【问题描述】:
如何对数据框进行子集化,以便仅包含包含具有在其他行中显示一定次数的值的列的行。
例如,如果我有一个标签为 Food 的列,我将如何过滤掉在整个数据框中出现少于 5 次的食物的所有行?
【问题讨论】:
-
我预测解决方案将涉及
table和%in%。 -
@Joran:是的,我做的第一件事是做一个表格,只是不知道如何连接它来过滤数据框。
如何对数据框进行子集化,以便仅包含包含具有在其他行中显示一定次数的值的列的行。
例如,如果我有一个标签为 Food 的列,我将如何过滤掉在整个数据框中出现少于 5 次的食物的所有行?
【问题讨论】:
table 和%in%。
这是一个简单的例子:
dat <- data.frame(x=runif(50),y=sample(letters,50,replace = TRUE))
dat[dat$y %in% names(table(dat$y))[table(dat$y) > 2],]
选择所有包含出现两次以上的字母的行。
【讨论】:
drop=T修复
这是使用plyr 的另一种方法(可能更简洁)。
ddply(dat, .(y), subset, length(x) > 2)
【讨论】:
对于此类问题,我是 ave 的粉丝。使用@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
【讨论】: