2014-12-18 142 views
5

我看到dplyr 0.3.0.2中的do函數看起來像奇怪的行爲,但也許我誤解了某些東西。dplyr中do()函數的奇怪行爲

我有一個看起來像

set.seed(668) 
stuff <- data.frame(name=c(rep("Frodzak", 5), rep("Dumpf", 4), rep("Ackpth", 6)), 
       state=c("AL", "AK", "AL", "KS", "OR", "LA", "MS", "KY", "FL", 
         "NY", "NY", "NJ", "PA", "NJ", "NY"), 
       important=c(F, F, T, F, F, T, F, F, F, T, F, F, F, F, F), 
       girth=rnorm(15, 250, 80), stringsAsFactors=F) 


stuff 

     name state important girth 

1 Frodzak AL  FALSE 148.5870 
2 Frodzak AK  FALSE 321.4144 
3 Frodzak AL  TRUE 224.8380 
4 Frodzak KS  FALSE 315.9416 
5 Frodzak OR  FALSE 331.4336 
6 Dumpf LA  TRUE 317.4794 
7 Dumpf MS  FALSE 170.4174 
8 Dumpf KY  FALSE 275.4033 
9 Dumpf FL  FALSE 240.9276 
10 Ackpth NY  TRUE 145.6290 
11 Ackpth NY  FALSE 267.6902 
12 Ackpth NJ  FALSE 171.4015 
13 Ackpth PA  FALSE 298.5841 
14 Ackpth NJ  FALSE 249.5764 
15 Ackpth NY  FALSE 276.5504 

在我的應用程序,會出現在每個組用相同的「名」行的「重要」一欄只有一個TRUE的數據幀。我想要對df進行子集化,以便僅包含狀態與「重要」行(在每個「名稱」組內)狀態相匹配的那些行。換句話說,我想

 name state important girth 
1 Ackpth NY  TRUE 145.6290 
2 Ackpth NY  FALSE 267.6902 
3 Ackpth NY  FALSE 276.5504 
4 Dumpf LA  TRUE 317.4794 
5 Frodzak AL  FALSE 148.5870 
6 Frodzak AL  TRUE 224.8380 

如果我運行以下命令:

importantState <- function(df) { 
    impst <- df[df$important, "state"] 
    if (length(impst) != 1) stop("group does not have one 'important'") 
    impst 
} 

stuff %>% group_by(name) %>% do(.[.$state == importantState(.), ]) 

dplyr 0.2我得到我期望到底是什麼(上述6行子集)。但是,如果我使用dplyr 0.3.0.2運行完全相同的代碼,它將返回整個原始df(全部15行)。

我看着在GitHub上的0.3版本說明,但我看不到任何會涉及變化的實質性行爲do

有人能通過解釋天堂的名字在這裏發生什麼,幫助我至少恢復一點理智嗎?或者有沒有想過的創意解決方案?

+0

也許我不理解,但你爲什麼不使用'過濾器'呢? –

+0

好問題:-)我想我那厚厚的頭腦沒有意識到你可以這樣做...... – NumerousHats

回答

2

也許你可以在這裏嘗試filter

stuff %>% 
    group_by(name) %>% 
    filter(state == state[important]) 

#  name state important girth 
# 1 Frodzak AL  FALSE 148.5870 
# 2 Frodzak AL  TRUE 224.8380 
# 3 Dumpf LA  TRUE 317.4794 
# 4 Ackpth NY  TRUE 145.6290 
# 5 Ackpth NY  FALSE 267.6902 
# 6 Ackpth NY  FALSE 276.5504