使用group_by时dplyr问题(多变量)
我想开始使用dplyr代替ddply,但我无法理解它是如何工作的(我已经阅读了文档) 例如,为什么当我尝试mutate()时,“group_by”函数不能正常工作 看看mtcars: 图书馆(汽车) 假设我制作了一个data.frame,它是mtcars的摘要,按“cyl”和“gear”分组: 我的语法有问题吗使用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
编辑: 如果我对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