dplyr(R)中的管道直方图

时间:2016-07-25 21:45:55

标签: r dplyr histogram

是否可以在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()等)以及使用多个图表完成的内容。我在这里简化了代码。

5 个答案:

答案 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))

这确实搞乱了标签:

lapply plot

Map / mapply

要使用base修复此问题,我们需要在数据和标签上并行迭代,这可以通过Mapmapply完成(因为我们不会这样做)关心结果 - 只有副作用 - 差异并不重要):

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))

Map plot

更漂亮。但是,如果您想要链接到它,您需要使用.来显示数据的去向:

birdsss %>% 
    Map(function(x, y){hist(x, breaks = 50, main = y, xlab = y)}, 
        ., 
        names(.))

purrr

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))

ggplot

完全不同的是,如果您计划最终将所有内容都放在单个图中,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')

ggplot version

看起来有点不同,但一切都是可编辑的。请注意,如果没有任何工作,你会得到漂亮的标签。

答案 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))

enter image description here

答案 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)