【问题标题】:dplyr: How to filter groups by subgroup criteriadplyr:如何按子组标准过滤组
【发布时间】:2015-05-27 04:44:21
【问题描述】:

我的问题与one类似,但过滤条件不同。

> demo(dadmom,package="tidyr")

> library(tidyr)
> library(dplyr)

> dadmom <- foreign::read.dta("http://www.ats.ucla.edu/stat/stata/modules/dadmomw.dta")

> dadmom %>%
+   gather(key, value, named:incm) %>%
+   separate(key, c("variable", "type"), -2) %>%
+   spread(variable, value, convert = TRUE)
  famid type   inc name
1     1    d 30000 Bill
2     1    m 15000 Bess
3     2    d 22000  Art
4     2    m 18000  Amy
5     3    d 25000 Paul
6     3    m 50000  Pat

用“incm”从原表中很容易找出妈妈收入>20000的家庭:

> dadmom
  famid named  incd namem  incm
1     1  Bill 30000  Bess 15000
2     2   Art 22000   Amy 18000
3     3  Paul 25000   Pat 50000

问题是:你如何从“整理”的数据中做到这一点?

【问题讨论】:

  • dplyr::filter(data, type == "m" &amp; inc &gt; 20000)?
  • 只返回一行。我想要整个团队 (m & d)。

标签: r dplyr data-manipulation tidyr


【解决方案1】:

您可以在代码中添加group_byfilter

#OP's code
d1 <- dadmom %>%
           gather(key, value, named:incm) %>%
           separate(key, c("variable", "type"), -2) %>%
           spread(variable, value, convert = TRUE)

 d1 %>% 
    group_by(famid) %>%
    filter(all(sum(type=='m' & inc > 15000)==sum(type=='m')))

#    famid type   inc name
# 1     2    d 22000  Art
# 2     2    m 18000  Amy
# 3     3    d 25000 Paul
# 4     3    m 50000  Pat

注意:上述方法也适用于每个家族有多个 'm's(更通用一点)

对于每个家庭单个“m/f”对的正常情况

 d1 %>%
     group_by(famid) %>% 
     filter(any(inc >15000 & type=='m'))
 #   famid type   inc name
 #1     2    d 22000  Art
 #2     2    m 18000  Amy
 #3     3    d 25000 Paul
 #4     3    m 50000  Pat

此外,如果您希望使用开发版本中的data.tablemelt,即v1.9.5 可以采用多个值列。可以从here安装

 library(data.table)
 melt(setDT(dadmom), measure.vars=list(c(2,4), c(3,5)), 
    variable.name='type', value.name=c('name', 'inc'))[,
    type:=c('d', 'm')[type]][, .SD[any(type=='m' & inc >15000)] ,famid]
 #    famid type name   inc
 #1:     2    d  Art 22000
 #2:     2    m  Amy 18000
 #3:     3    d Paul 25000
 #4:     3    m  Pat 50000

【讨论】:

  • 谢谢。我不知道“任何”和“全部”。它们是有效的功能吗?我问是因为我的实际数据会有很多组,并且组内有很多行(尽管非常规则,固定的数量和顺序)。
  • @Dong 我想是的。你的数据集有多大?
  • 现在不大。 ~(7x200k) --> (7x400k) 整理后。现在它是大约 100k 组——就像来自 group_by(famid) 的那些,每组 4 行。但是随着我收集更多的实验数据,数据的宽度和长度都会增加。
  • @Dong 想一想,如果它变大了,在gather 之前进行子集化不是更好吗(虽然还没有进行基准测试)
猜你喜欢
  • 2017-08-23
  • 2014-12-16
  • 2018-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多