按两列分组数据和过滤器组(dplyr)

时间:2017-12-19 15:46:30

标签: r filter group-by dplyr

我对dplyr有疑问。

我想通过其RestaurantID对数据进行分组,然后在1992年过滤所有工资> = 5的群组。

例如:

我有:

 RestaurantID     Year        Wage
     1             92          6
     1             93          4
     2             92          3
     2             93          4
     3             92          5
     3             93          5

我想要的数据集(1992年工资的所有组> = 5)

 RestaurantID     Year        Wage
     1             92          6
     1             93          4
     3             92          5
     3             93          5

我试过了:

data %>% group_by("RestaurantID") %>% filter(any(Wage>= '5', Year =='92'))

但这给了我所有行,其中工资是> = 5。

2 个答案:

答案 0 :(得分:3)

我们可以在不使用filter

进行分组的情况下执行此操作
library(dplyr)
df1 %>% 
    filter(RestaurantID %in% RestaurantID[Year==92 & Wage>= 5])
#   RestaurantID Year Wage
#1            1   92    6
#2            1   93    4
#3            3   92    5
#4            3   93    5

或与base R

相同的逻辑
subset(df1, RestaurantID %in% RestaurantID[Year==92 & Wage>= 5])
#   RestaurantID Year Wage
#1            1   92    6
#2            1   93    4
#5            3   92    5
#6            3   93    5

答案 1 :(得分:2)

如果您希望返回该组的所有行,则每个ID都有一个TRUE值。在这种情况下,TRUE值将循环到该组的长度,因此返回所有行。

df %>% group_by(RestaurantID) %>% filter(Wage[Year == 92] >= 5)
## A tibble: 4 x 3
## Groups:   RestaurantID [2]
#  RestaurantID  Year  Wage
#         <int> <int> <int>
#1            1    92     6
#2            1    93     4
#3            3    92     5
#4            3    93     5

请注意,在比较数字时,您不应该引用它们,例如&#39; 5&#39;因为这会将数字变成字符。

或者,您可以将原始方法修改为:

df %>% group_by(RestaurantID) %>% filter(any(Wage >= 5 & Year == 92))

也会返回正确的子集。