【问题标题】:Select groups which have at least one of a certain value选择具有至少一个特定值的组
【发布时间】:2017-04-11 00:54:57
【问题描述】:

如何根据各个行的条件选择组,比如保留所有包含 至少一个 (ANY) 特定值的组,例如4,(或至少一次TRUE 的任何其他条件)。或者反过来说:如果一个组没有有任何条件为真的行,则应该删除整个组。

我们来看一个非常简单的数据,有两组,我想选择至少有一行Value为4的组,(即此处的组B

library(dplyr)
df <- data.frame(Group = LETTERS[c(1,1,1,2,2,2)], Value=c(1:5, 4))

df
#   Group Value
# 1     A     1 # Group A has no values == 4 ~~> remove entire group 
# 2     A     2
# 3     B     3
# 4     B     4 # Group B has at least one 4 ~~> keep the whole group

执行group_by(),然后执行filter(如this post)将只选择包含值4的单个行,而不是整个组:

df %>%
  group_by(Group) %>%
  filter(Value == 4)
#    Group Value
#   <fctr> <int>
# 1      B     4

【问题讨论】:

  • 在基础 R 中,df[with(df, ave(Value == 4, Group, FUN = any)), ]

标签: r dplyr tidy


【解决方案1】:

这很容易:您只需要在filter 调用中使用any() 函数。确实,看来:

  • filter(any(...))group_by() 级别进行评估,

  • filter(...)rowwise() 级别进行评估,即使前面有group_by()

因此使用:

 df %>%
    group_by(Group) %>%
    filter(any(Value==4)) 

Group Value
 <fctr> <int>
1      B     3
2      B     4

有趣的是,mutate 也出现了同样的情况,比较:

df %>%
group_by(Group) %>%
mutate(check1=any(Value==4), 
       check2=Value==4) 

   Group Value check1 check2
  <fctr> <int>  <lgl>  <lgl>
1      A     1  FALSE  FALSE
2      A     2  FALSE  FALSE
3      B     3   TRUE  FALSE
4      B     4   TRUE   TRUE

【讨论】:

  • 当我运行上面完全相同的代码时,对于 check1,我得到的都是 TRUE。有人知道为什么吗?
  • 这确实令人惊讶!你在做group_by 吗?你有哪个版本的 dplyr?
【解决方案2】:

data.table 选项是

library(data.table)
setDT(df)[, if(any(Value==4)) .SD, by = Group]
#   Group Value
#1:     B     4
#2:     B     5
#3:     B     4

【讨论】:

    【解决方案3】:

    在基础 R 中,我们可以不执行任何分组操作:

    subset(df, Group %in% unique(Group[Value == 4]))
    
    #  Group Value
    #4     B     4
    #5     B     5
    #6     B     4
    

    【讨论】:

      猜你喜欢
      • 2018-12-08
      • 1970-01-01
      • 1970-01-01
      • 2021-08-07
      • 2020-11-19
      • 1970-01-01
      • 2021-05-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多