是否可以在dplyr中管理多个图形。
这是有效的:
birdsss = data.frame(x1 = 1:10,x2 = 21:30,x3 = 41:50)
birdsss%>%
with(hist(x1, breaks = 50))
但这不起作用:
birdsss%>%
with(hist(x1, breaks = 50)) %>%
with(hist(x2, breaks = 50)) %>%
with(hist(x3, breaks = 50))
Error in hist(x2, breaks = 50) : object 'x2' not found
我也试过了:
birdsss%>%
with(hist(x1, breaks = 50)) &
with(hist(x2, breaks = 50)) &
with(hist(x3, breaks = 50))
和
birdsss%>%
with(hist(x1, breaks = 50)) ;
with(hist(x2, breaks = 50)) ;
with(hist(x3, breaks = 50))
在一行中打印多列的解决方案是什么?
类似的东西:
birdsss%>%
with(hist(x1:x3, breaks = 50))
我正在使用更长的管道(filter(),select()等)以及使用多个图表完成的内容。我在这里简化了代码。
答案 0 :(得分:7)
正常管道%>%
将左侧管道移到右侧。 hist
返回一个(非常有用的)hist
对象,但它不是可以传输到另一个直方图的数据。你想要" T"管:
library(magrittr)
birdsss %T>%
with(hist(x1, breaks = 50)) %T>%
with(hist(x2, breaks = 50)) %T>%
with(hist(x3, breaks = 50))
这将管道在第一个" T"之前发生的任何事情。无论发生什么事。有关详细信息,请参阅the magrittr documentation。
答案 1 :(得分:7)
lapply
将上面的一些评论放到答案中,最简单的方法是对每个变量进行直方图
# let's put them in a single plot
par(mfrow = c(1, 3))
lapply(birdsss, hist, breaks = 50) # or chain into it: birdsss %>% lapply(hist, breaks = 50)
# set back to normal
par(mfrow = c(1, 1))
这确实搞乱了标签:
Map
/ mapply
要使用base修复此问题,我们需要在数据和标签上并行迭代,这可以通过Map
或mapply
完成(因为我们不会这样做)关心结果 - 只有副作用 - 差异并不重要):
par(mfrow = c(1, 3))
Map(function(x, y){hist(x, breaks = 50, main = y, xlab = y)},
birdsss,
names(birdsss))
par(mfrow = c(1, 1))
更漂亮。但是,如果您想要链接到它,您需要使用.
来显示数据的去向:
birdsss %>%
Map(function(x, y){hist(x, breaks = 50, main = y, xlab = y)},
.,
names(.))
Hadley的purrr
包使*apply
- 样式循环更明显可链接(虽然不相关,更容易使用列表)而不用担心.
s。在这里,由于您正在迭代副作用并希望迭代两个变量,请使用walk2
:
library(purrr)
walk2(birdsss, names(birdsss), ~hist(.x, breaks = 50, main = .y, xlab = .y))
返回与前一个Map
调用完全相同的内容(如果以相同的方式设置mfrow
),尽管没有无用的输出到控制台。 (如果您需要该信息,请改用map2
。)请注意,迭代的参数首先是,因此您可以轻松链接:
birdsss %>% walk2(names(.), ~hist(.x, breaks = 50, main = .y, xlab = .y))
完全不同的是,如果您计划最终将所有内容都放在单个图中,ggplot2可以通过facet_*
函数轻松制作相关图:
library(ggplot2)
# gather to long form, so there is a variable of variables to split facets by
birdsss %>%
tidyr::gather(variable, value) %>%
ggplot(aes(value)) +
# it sets bins intead of breaks, so add 1
geom_histogram(bins = 51) +
# make a new "facet" for each value of `variable` (formerly column names), and
# use a convenient x-scale instead of the same for all 3
facet_wrap(~variable, scales = 'free_x')
看起来有点不同,但一切都是可编辑的。请注意,如果没有任何工作,你会得到漂亮的标签。
答案 2 :(得分:1)
另一种方法:
library(dplyr)
library(tidyr)
birdsss <- data.frame(x1 = 1:10, x2 = 21:30, x3 = 41:50)
my_hist <- function(x) {
hist(x$val, breaks=50, xlab=x$var[1], main=sprintf("Histogram of %s", x$var[1]))
}
par(mfrow=c(3,1))
birdsss %>%
gather(var, val, x1, x2, x3) %>%
group_by(var) %>%
do(a=my_hist(.)) %>%
invisible()
par(mfrow=c(1,1))
答案 3 :(得分:0)
您可以尝试:
attach(birdsss)
hist(x1,breaks = 50)
hist(x2,breaks = 50)
hist(x3,breaks = 50)
detach(birdsss)
或者可能更好:
with(birdsss,{
hist(x1,breaks = 50)
hist(x2,breaks = 50)
hist(x3,breaks = 50)
}
)
我记得在某个地方读过使用attach
会导致混淆。
答案 4 :(得分:0)
如果您想将其完全保留在 dplyr
内,您只需使用 select
函数来选择您希望生成直方图的变量,以使用以下解决方案:
hist((birdsss %>%
select(x1:x3)), breaks = 20)