使用group_by(多个variables)时dplyr问题

我想开始使用dplyr来代替ddply,但是我无法得到它是如何工作的(我已阅读文档)。

例如,为什么当我尝试mutate()时,“group_by”函数不工作,因为它应该?

看mtcars:

库(车)

说我做了一个data.frame这是一个mtcars总结,分为“cyl”和“齿轮”:

df1 <- mtcars %.% group_by(cyl, gear) %.% summarise( newvar = sum(wt) ) 

然后说我想进一步总结这个数据框。 使用ddply,这将是直接的,但是当我尝试使用dplyr时,它实际上并不是“按…分组”:

 df2 <- df1 %.% group_by(cyl) %.% mutate( newvar2 = newvar + 5 ) 

仍产生一个未分组的输出:

  cyl gear newvar newvar2 1 6 3 6.675 11.675 2 4 4 19.025 24.025 3 6 4 12.375 17.375 4 6 5 2.770 7.770 5 4 3 2.465 7.465 6 8 3 49.249 54.249 7 4 5 3.653 8.653 8 8 5 6.740 11.740 

我在语法上做错了什么?


编辑:

如果我要用plyr和ddply来做到这一点:

 df1 <- ddply(mtcars, .(cyl, gear), summarise, newvar = sum(wt)) 

然后得到第二个df:

 df2 <- ddply(df1, .(cyl), summarise, newvar2 = sum(newvar) + 5) 

但是sumre()函数中的sum(newvar)+ 5和dplyr不能一样的方法。

让Dickoa的答案更进一步 – 正如Hadley所说的“总结剥离一个单一的分组层次”。 它会从您应用它的相反顺序中剥离分组,以便您可以使用

 mtcars %>% group_by(cyl, gear) %>% summarise(newvar = sum(wt)) %>% summarise(newvar2 = sum(newvar) + 5) 

请注意,如果在第二行使用group_by(gear, cyl) ,这将给出不同的答案。

为了让你第一次尝试工作:

 df1 <- mtcars %>% group_by(cyl, gear) %>% summarise(newvar = sum(wt)) df2 <- df1 %>% group_by(cyl) %>% summarise(newvar2 = sum(newvar)+5) 

我有一个类似的问题。 我发现,简单的分离plyr解决了它:

 detach(package:plyr) library(dplyr) 

如果您使用summarise而不是mutate将您的plyr代码转换为dplyr ,则会得到相同的结果。

 library(plyr) df1 <- ddply(mtcars, .(cyl, gear), summarise, newvar = sum(wt)) df2 <- ddply(df1, .(cyl), summarise, newvar2 = sum(newvar) + 5) df2 ## cyl newvar2 ## 1 4 30.143 ## 2 6 26.820 ## 3 8 60.989 detach(package:plyr) library(dplyr) mtcars %.% group_by(cyl, gear) %.% summarise(newvar = sum(wt)) %.% group_by(cyl) %.% summarise(newvar2 = sum(newvar) + 5) ## cyl newvar2 ## 1 4 30.143 ## 2 8 60.989 ## 3 6 26.820 

编辑

由于summarise了最后一组( gear ),你可以跳过第二个group_by (见下面的@hadley注释)

 library(dplyr) mtcars %.% group_by(cyl, gear) %.% summarise(newvar = sum(wt)) %.% summarise(newvar2 = sum(newvar) + 5) ## cyl newvar2 ## 1 4 30.143 ## 2 8 60.989 ## 3 6 26.820 

分离plyr是解决问题的一种方法,因此您可以根据需要使用dplyr函数…但是如果您需要plyr其他函数来完成代码中的其他任务呢?

(在这个例子中,我已经加载了dplyrplyr库)

假设我们有一个简单的data.frame,并且我们想要计算variablesvaluegname总和,当按不同级别的gname

 > dx<-data.frame(gname=c(1,1,1,2,2,2,3,3,3), value = c(2,2,2,4,4,4,5,6,7)) > dx gname value 1 1 2 2 1 2 3 1 2 4 2 4 5 2 4 6 2 4 7 3 5 8 3 6 9 3 7 

但是,当我们试图使用我们认为会产生dplyr分组的总和时,会发生以下情况:

 dx %>% group_by(gname) %>% mutate(mysum=sum(value)) Source: local data frame [9 x 3] Groups: gname gname value mysum 1 1 2 36 2 1 2 36 3 1 2 36 4 2 4 36 5 2 4 36 6 2 4 36 7 3 5 36 8 3 6 36 9 3 7 36 

它没有给我们想要的答案。 可能是由于dplyrplyr之间的group_by和/或mutate函数的一些交互或重载。 我们可以分离plyr ,但另一种方法是给予group_bymutatedplyr版本一个独特的调用:

 dx %>% dplyr::group_by(gname) %>% dplyr::mutate(mysum=sum(value)) Source: local data frame [9 x 3] Groups: gname gname value mysum 1 1 2 6 2 1 2 6 3 1 2 6 4 2 4 12 5 2 4 12 6 2 4 12 7 3 5 18 8 3 6 18 9 3 7 18 

现在我们看到这个按预期工作。

dplyr正如你在你的例子中所期望的那样工作。 就像你指定的那样,mutate只会为newvar的每个值加5,因为它会创buildnewvar2。 如果你组合,这看起来是一样的。 但是,如果你指定了一组不同的组,你将会得到不同的结果。 例如:

 df1 %.% group_by(cyl) %.% mutate( newvar2 = newvar + mean(cyl) ) 
Interesting Posts