我看到0.3.0.2中do函数的奇怪行为dplyr,但也许我误解了一些东西.
我有一个看起来像的数据框
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
Run Code Online (Sandbox Code Playgroud)
在我的应用程序中,对于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
Run Code Online (Sandbox Code Playgroud)
如果我运行以下内容:
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(.), ])
Run Code Online (Sandbox Code Playgroud)
在dplyr 0.2我得到我期望的(上面的6行子集).但是,如果我使用dplyr 0.3.0.2它运行完全相同的代码,则返回整个原始df(全部15行).
我查看了github上的0.3发行说明,但我没有看到任何与实质行为的变化相关的内容do.
有人可以通过解释天堂的名字在这里帮助我恢复至少一点理智吗?或者我没有想到的创意解决方案的任何想法?
也许你可以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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
81 次 |
| 最近记录: |