2015-06-24 86 views
6

過濾數據管理舉一個簡單的數據集GROUP BY和使用dplyr

a <- c(1,2,3,4,5,6,7,8) 
b <- c(1,2,2,1,2,2,2,2) 
c <- c(1,1,1,2,2,2,3,3) 
d <- data.frame(a,b,c) 

現在我想我的過濾數據,使我們group_by(c),然後刪除在沒有b=1發生的所有數據。

這樣的結果(e)應該像d但沒有兩個底部行

我一直在使用

e <- d %>% 
    group_by(c) %>% 
    filter(n(b)>1) 

的輸出應包括以下綠色數據和紅色刪除數據嘗試

enter image description here

+2

'é<- d %>%GROUP_BY(C)%>%的過濾器(B = = 1)' – SabDeM

+2

'!b == 1'等於'b!= 1',這可能更具可讀性? –

+0

不完全,所以爲了我想刪除每個'c'身份沒有'b == 1'的每個獨特'c'行 – lukeg

回答

10

嘗試

d %>% 
    group_by(c) %>% 
    filter(any(b == 1)) 

其中給出:

#Source: local data frame [6 x 3] 
#Groups: c 
# 
# a b c 
#1 1 1 1 
#2 2 2 1 
#3 3 2 1 
#4 4 1 2 
#5 5 2 2 
#6 6 2 2 
+0

太好了。謝謝,'any'功能是什麼。它沒有記錄在http://cran.r-project.org/web/packages/dplyr/dplyr.pdf – lukeg

+2

@lukeg這不是'dplyr'軟件包的一部分。 'any()'在基數R中。從'?any':*給定一組邏輯向量,至少有一個值是真的?* –

0

您可以嘗試

df <- d %>% mutate(test = ifelse((b != 1) == T, 0, 1)) %>% group_by(c) %>% 
      mutate(test = sum(test)) %>% filter(test != 0) %>% select(-test) 

這將產生

# a b c 
#1 1 1 1 
#2 2 2 1 
#3 3 2 1 
#4 4 1 2 
#5 5 2 2 
#6 6 2 2 
+3

這看起來過於複雜。你爲什麼不把所有的操作都鏈接起來?爲什麼使用'mutate()'創建一些變量,有些則使用'$'?你爲什麼以'ungroup()'結束? –

+0

@Steven Beaupre,謝謝。編輯鏈接操作 –