从dplyr管道生成直方图

从dplyr管道生成直方图,r,dplyr,R,Dplyr,我有一个数据集,我想对它进行分组(),并为每个组生成一个直方图。我目前的代码如下: df %>% group_by(x2) %>% with(hist(x3,breaks = 50)) 然而,这会生成整个x3的一个直方图,而不是x3的几个块。这里是一些示例数据 df = data.frame(x1 = rep(c(1998,1999,2000),9), x2 = rep(c(1,1,1,2,2,2,3,3,3),3), x3

我有一个数据集,我想对它进行分组(),并为每个组生成一个直方图。我目前的代码如下:

df %>%
  group_by(x2) %>%
  with(hist(x3,breaks = 50))
然而,这会生成整个x3的一个直方图,而不是x3的几个块。这里是一些示例数据

df = data.frame(x1 = rep(c(1998,1999,2000),9),
            x2 = rep(c(1,1,1,2,2,2,3,3,3),3),
            x3 = rnorm(27,.5))
期望输出:

实际产量:


我认为现在是进入ggplot的时候了,例如:

library(tidyverse)

df %>% 
  ggplot(aes(x = x3)) + 
  geom_histogram(bins = 50) + 
  facet_wrap(~x2) # optional: use argument "ncols = 1"

我想我对do的评论已经过时了<代码>?do向我们指出当前的
?组步行

df %>%
 group_by(x2) %>%
 group_walk(~ hist(.x$x3))
dplyr
<0.8.0版本中,没有
group\u walk
,因此您可以使用
do

df %>% 
  group_by(x2) %>%
  do(h = hist(.$x3))

假设您只需要
hist
(打印的直方图)的副作用,而不需要返回值,您可以添加一个
%%>%invisible()
到链的末尾,以不打印生成的TIBLE。

您可以使用
split.data.frame
命令根据类别分割数据,然后在数据帧列表中运行hist命令

list_df <- split.data.frame(df, f= df$x2)
par(mfrow = c(round(length(list_df), 0), 1))

for( lnam in names(list_df)){
  hist(list_df[[lnam]][, "x3"])

}


list_df我非常喜欢@Gregor关于
group_walk
的回答,但它仍然在
dplyr
v0.8.0.1中被列为实验性的。如果希望避免使用以后可能中断的函数,我会使用base
split
,然后使用
purrr::walk
。我正在使用
walk
plot
来避免
hist
给出的所有文本打印输出

库(dplyr)
图书馆(purrr)
df%>%
分割(.$x2)%>%
行走(~hist(.$x3)%>%plot())

Base R函数,例如
hist
不关心dplyr的
groupby
?do
应该帮助hist只获取一列数据,它忽略您的分组。使用ggplot代替或do@infominerOP使用
将管道传输到
,这将获取完整的数据帧。问题是,来自外部的函数
dplyr
忽略分组--
ggplot
的情况与
hist
@Gregor的情况一样。在我输入评论后注意到了。有了ggplot,他们将不得不刻面,或者能够使用填充来给条形图上色。也许我遗漏了什么,OP确实包含了样本数据
facet\u网格(rows=vars(x2))
更符合OP的预期输出。在OP的数据创建代码中,我给每个列向量加了一个零,但我在帖子的编辑历史中没有看到任何内容。这不意味着你的帖子有问题。
group\u walk
来自哪里
sos::findFn('group_walk')
找到了0个匹配项。这是一个dplyr函数,您可能需要更新到最新的软件包版本。@RuiBarradas我想这是dplyr 0.8.0中的新版本。为了向后兼容,我将添加一个
do
版本。谢谢!这正是我想要的。是否可以在
group\u walk()调用中传递其他参数?例如,将主标题更改为分组变量是什么?类似于'main=.x$x2'(该语法对“未知或未初始化的列”不起作用)编辑-算出它,需要用yx$x2来初始化列。同时我更新了包<代码> dPLYR 。不错的答案!考虑<代码> %%%不可见> /代码>作为避免文本输出的更直接/一般的方式。<代码>分割<代码>是S3函数,所以如果您只使用<代码>分割(DF,f= df$x2)
它将为您发送
split.data.frame