【问题标题】:How To Filter a Dataframe based on Category Counts如何根据类别计数过滤数据框
【发布时间】:2011-10-11 09:55:10
【问题描述】:

如何对数据框进行子集化,以便仅包含包含具有在其他行中显示一定次数的值的列的行。

例如,如果我有一个标签为 Food 的列,我将如何过滤掉在整个数据框中出现少于 5 次的食物的所有行?

【问题讨论】:

  • 我预测解决方案将涉及table%in%
  • @Joran:是的,我做的第一件事是做一个表格,只是不知道如何连接它来过滤数据框。

标签: r filtering


【解决方案1】:

这是一个简单的例子:

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

选择所有包含出现两次以上的字母的行。

【讨论】:

  • 您只是预测自己的答案吗?这算不算真正的远见?无论如何我都会投票,因为你的答案很简单而且有效。
  • @Seth - 我正在等待(返回)飞机,所以我开始发表评论,认为我没有时间再做更多了。但后来似乎我有几分钟的时间,所以我写了答案……此刻我预测我将在机场度过漫长的一天。 :(
  • 有效,在我的情况下唯一需要注意的是(我没有说明),因为这是一个因素,箱线图仍然显示沿 X 轴的所有级别,而不仅仅是那些值。
  • droplevels() 应该解决这个问题。
  • 啊,可以用drop=T修复
【解决方案2】:

这是使用plyr 的另一种方法(可能更简洁)。

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

【讨论】:

    【解决方案3】:

    对于此类问题,我是 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
    

    【讨论】:

      猜你喜欢
      • 2019-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-17
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      相关资源
      最近更新 更多