我看到do
0.3.0.2中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
在我的应用程序中,对于每组具有相同“名称”的行,“重要”列中只有一个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 :(得分: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