【问题标题】:How to subset by group with dplyr如何使用 dplyr 按组进行子集化
【发布时间】:2016-12-25 10:39:34
【问题描述】:

我有一个数据集如下:

col1 col2 
1    26  
1    43    
1    34   
2    54
2    27
3    15
4    1
4    4

我只想选择 col2 大于 25 的那些组,因此结果数据集应该是

  col1 col2 
    1    26  
    1    43    
    1    34   
    2    54
    2    27

这是一个示例数据集,而不是真实的数据,所以我真的在寻找一个 dplyr 答案,而不是一个简单的子集答案:

Nr<-Mrd %>% 
  group_by(col1) %>% 
  slice(which.min(col2>25))

但是,这个答案会让我得到每个组中 >25 的行,而不是最小 >25 的组。

【问题讨论】:

  • 我不明白你想要的输出。在您的任何组中,最小值均不大于 25。您是否在寻找大于 25 的 any 值?像Mrd %&gt;% group_by(col1) %&gt;%filter(any(col2 &gt; 25)) 这样的东西?你真的需要尝试正确地解释自己
  • 您的意思是要将col1 保留在col2 中至少有1 个值> 25 的位置吗? (即在基地 r ind &lt;- df$col1[df$col2 &gt; 25];df[df$col1 %in% ind,]
  • 道歉。我已经更改了数据,使前两组中的最小值超过 25。但是问题仍然存在 - 我希望得到最小值大于 25 的组

标签: r


【解决方案1】:

按照您的思路,您不需要which.min,而是需要minfilter 而不是slice

df %>% 
   group_by(col1) %>% 
   filter(min(col2) > 25)

#Source: local data frame [5 x 2]
#Groups: col1 [2]

#   col1  col2
#  <int> <int>
#1     1    26
#2     1    43
#3     1    34
#4     2    54
#5     2    27

【讨论】:

    【解决方案2】:

    我们可以使用data.table

    library(data.table)
    setDT(df)[, if(min(col2) > 25) .SD, by = col1]
    #   col1 col2
    #1:    1   26
    #2:    1   43
    #3:    1   34
    #4:    2   54
    #5:    2   27
    

    或者使用来自base Rave

    df[with(df, ave(col2>25, col1, FUN = all)),]
    #  col1 col2
    #1    1   26
    #2    1   43
    #3    1   34
    #4    2   54
    #5    2   27
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-28
      • 2014-08-10
      • 2015-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多