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

时间:2014-12-18 21:09:34

标签: r dplyr

我看到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中实质行为的变化有关的内容。

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

1 个答案:

答案 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