dplyr中do()函数的奇怪行为

Num*_*ats 5 r dplyr

我看到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.

有人可以通过解释天堂的名字在这里帮助我恢复至少一点理智吗?或者我没有想到的创意解决方案的任何想法?

Hen*_*rik 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
Run Code Online (Sandbox Code Playgroud)