使用group_by时dplyr问题(多变量)

使用group_by时dplyr问题(多变量),r,group-by,dplyr,compound-key,R,Group By,Dplyr,Compound Key,我想开始使用dplyr代替ddply,但我无法理解它是如何工作的(我已经阅读了文档) 例如,为什么当我尝试mutate()时,“group_by”函数不能正常工作 看看mtcars: 图书馆(汽车) 假设我制作了一个data.frame,它是mtcars的摘要,按“cyl”和“gear”分组: 我的语法有问题吗 编辑: 如果我对plyr和ddply这样做: df1 <- ddply(mtcars, .(cyl, gear), summarise, newvar = sum(wt)) d

我想开始使用dplyr代替ddply,但我无法理解它是如何工作的(我已经阅读了文档)

例如,为什么当我尝试mutate()时,“group_by”函数不能正常工作

看看mtcars:

图书馆(汽车)

假设我制作了一个data.frame,它是mtcars的摘要,按“cyl”和“gear”分组:

我的语法有问题吗


编辑:

如果我对plyr和ddply这样做:

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

df1dplyr的工作原理与您在示例中所期望的一样。正如您所指定的,Mutate在创建newvar2时,只会向newvar的每个值添加5。无论你是否分组,这看起来都一样。但是,如果您按组指定不同的内容,您将得到不同的内容。例如:

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

如果您使用
summary
而不是
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

把迪科亚的答案再向前推进一步——正如哈德利所说,“总结一层分组的剥皮情况”。它从应用分组的相反顺序剥离分组,这样您就可以使用它了

mtcars %>%
 group_by(cyl, gear) %>%
 summarise(newvar = sum(wt)) %>%
 summarise(newvar2 = sum(newvar) + 5)
请注意,如果在第二行中使用
分组依据(档位,气缸)
,则会给出不同的答案

为了让您的第一次尝试成功:

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

df2 <- df1 %>%
 group_by(cyl) %>%
 summarise(newvar2 = sum(newvar)+5)
df1%
组别(气缸,档位)%>%
总结(新风险值=总和(wt))
df2%
组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别
总结(新变量2=总和(新变量)+5)

我也有类似的问题。我发现简单地分离
plyr
就解决了这个问题:

detach(package:plyr)    
library(dplyr)

分离
plyr
是解决问题的一种方法,因此您可以根据需要使用
dplyr
功能。。。但是,如果您需要来自
plyr
的其他函数来完成代码中的其他任务,该怎么办

(在本例中,我加载了
dplyr
plyr
库)

假设我们有一个简单的data.frame,当按
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
它没有给我们想要的答案。可能是由于
groupby
之间的
dplyr
plyr
之间的
mutate
函数的一些交互作用或过载。我们可以分离
plyr
,但另一种方法是通过
mutate
groupu的
dplyr
版本进行唯一调用:

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

现在,我们看到这是预期的效果。

请给我们等效的
plyr
代码和
ddply
代码,好吗?你说的“未分组”是什么意思?您希望每组有一行吗?或者,您希望同一组中的所有行都位于彼此下方?我希望第二个df只有三行(每个cyl一行),正如我刚才在编辑中添加的ddply参数所示。。。我想这只是在我缺少的某个地方添加一个参数的问题?那么我认为你混淆了
mutate
summary
。啊,我也是。如果我想在添加新变量的同时总结一个数据帧,那么总结会像mutate一样高效吗?那么第二个“group_by()”和“summary()”调用会覆盖第一个调用吗?是的,您也可以使用
regroup
来强制执行。您不需要第二个
group_by()
此处,因为Summary会自动删除最后一个组(它折叠的组)。谢谢@hadley,我不知道此功能。如果出于某种原因您不想分离
plyr
,您总是可以在
groupby
summary
函数前面指定
dplyr::
。我仍然希望获得有关哈德利“剥离”隐喻的更好信息。有人对此有一些参考资料或其他发布的答案吗?请参阅包含以下短语的部分:“每个摘要都会剥离一个级别的分组”。在过去一个半小时里,我一直坐在这里发抖,试图理解为什么dplyr只是忽略了我的分组。很高兴知道我不仅仅是疯了。我不明白为什么在使用
summary
时代码运行得很好,但在以后访问它时却不行。事实上,我在加载
dplyr
后添加了
plyr
。这就是为什么。不确定这是否是最近添加的,但我最近在加载这两个时发现了这一点:
您在dplyr之后加载了plyr-这可能会导致问题。如果您需要plyr和dplyr的函数,请先加载plyr,然后加载dplyr:library(plyr);库(dplyr)
。这通常发生在
dplyr
方法被重载时。一般的解决方案是使用
dplyr::summerise(…)
显式引用
dplyr
的方法版本。
mtcars %>%
 group_by(cyl, gear) %>%
 summarise(newvar = sum(wt)) %>%
 summarise(newvar2 = sum(newvar) + 5)
df1 <- mtcars %>%
 group_by(cyl, gear) %>%
 summarise(newvar = sum(wt))

df2 <- df1 %>%
 group_by(cyl) %>%
 summarise(newvar2 = sum(newvar)+5)
detach(package:plyr)    
library(dplyr)
> 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
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
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