2017-03-13 19 views
1

我有一个数据集,我想过滤不同组中的行。根据多个条件过滤组内的行

鉴于这种数据帧:

group = as.factor(c(1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3)) 
fruit = as.factor(c("apples", "apples", "apples", "oranges", 
        "oranges", "apples", "oranges", 
        "bananas", "bananas", "oranges", "bananas")) 
hit = c(1, 0, 1, 1, 
     0, 1, 1, 
     1, 0, 0, 1) 

dt = data.frame(group, fruit, hit) 
dt 
    group fruit hit 
     1 apples 1 
     1 apples 0 
     1 apples 1 
     1 oranges 1 
     2 oranges 0 
     2 apples 1 
     2 oranges 1 
     3 bananas 1 
     3 bananas 0 
     3 oranges 0 
     3 bananas 1 

我想用一组内的fruit第一次出现来过滤基团。但还有一个条件,我只想保留hit等于1的水果行。

因此,对于group 1,​​是第一次出现,它有两次正面命中,因此我希望保留这两行。

结果是这样的:

group fruit hit 
    1 apples 1 
    1 apples 1 
    2 oranges 1 
    3 bananas 1 
    3 bananas 1 

我知道你可以用dplyr过滤,但我不知道我能做到这一点。

+2

是的,你可以用'dplyr实现这一目标'(很容易)。只要看看小插曲,你会找到一个方法来做到这一点:https://cran.rstudio.com/web/packages/dplyr/vignettes/introduction.html – ottlngr

+0

谢谢,我会看看! –

回答

1

我们可以使用dplyr。通过“组”分组之后,filter有行“打”不等于0(&)的“果”为“水果”的first元素

library(dplyr) 
dt %>% 
    group_by(group) %>% 
    filter(hit!=0 & fruit == first(fruit)) 
# group fruit hit 
# <fctr> <fctr> <dbl> 
#1  1 apples  1 
#2  1 apples  1 
#3  2 oranges  1 
#4  3 bananas  1 
#5  3 bananas  1