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
。
有人能通過解釋天堂的名字在這裏發生什麼,幫助我至少恢復一點理智嗎?或者有沒有想過的創意解決方案?
也許我不理解,但你爲什麼不使用'過濾器'呢? –
好問題:-)我想我那厚厚的頭腦沒有意識到你可以這樣做...... – NumerousHats