2017-03-13 6 views
1

私は異なるグループ内の行をフィルタリングするデータセットを持っています。私はグループをフィルタリングするためにグループ内fruitの最初の発生を使用したい複数の条件に基づいてグループ内の行をフィルタリングする

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 

は、このデータフレームを考えます。しかし、別の条件があります、私はその果物の列を保つことが好きでしょうhit1と等しいです。

したがって、group 1の場合、​​が最初に発生し、正のヒットが2回あるため、この2つの行を保持したいと思います。

結果は次のようになります。

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を使用できます。 「果物」のfirst要素として、「グループ」、0と等しくない「ヒット」しているfilter行と(&)「果物」で

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 
関連する問題