从do()

时间:2016-05-11 16:03:57

标签: r ggplot2 dplyr

我试图用dplyr::do()在data.frame的子组上调用绘图函数,每个子组产生一个图形(ggplot对象)。一世 想要基于分组变量的每个数字的标题。为此,我的函数需要知道分组变量是什么。

目前,作为do()传递给.的内容是类tbl_df的对象  和data.frame。如果没有明确地将它作为单独的变量传递,有没有办法直接检查data.frame以了解分组变量是什么?

发布here的解决方案调用显式传递(每个)分组变量作为函数的附加参数。我想知道是否有更多,优雅和通用的解决方案可扩展到不同数量的分组变量。虽然在这个特定的实例中我对绘图很感兴趣,但还有其他一些用例,我想知道如何在每个子组上调用的函数中定义子组。

我不想通过查找列的位置来猜测 length(unique(col)) == 1因为这会导致很多错误 我的数据是积极的。

有优雅的方法吗?

以下是一些入门示例代码。

library(ggplot2)
my_plot <- function(df) {
  subgroup_name <- "" # ??
  ggplot(aes(cty, hwy)) + geom_point() +
    ggtitle(subgroup_name)
}

 mpg %>%
   group_by(manufacturer) %>%
   do(my_plots = my_plot(.))

1 个答案:

答案 0 :(得分:2)

我不认为可以在不将分组变量的名称传递给函数的情况下执行此操作(我认为分组变量&#34; vars&#34;属性在分割groups_df后丢失了data.frame,在执行&#34; do&#34;)之前。这是一个替代解决方案,需要在应用dplyr group_by%&gt;%do chain之前在向量中定义分组变量:

library(ggplot2)
library(dplyr)

my_plot <- function(df, group_vars) {

    # get plot name from value(s) in grouping variable(s)
    subgroup_name <- paste(df[1, group_vars], collapse = " ")

    ggplot(data = df, aes(cty, hwy)) + geom_point() + ggtitle(subgroup_name)

}


group1 <- "manufacturer"
plots1 <- 
    mpg %>% 
    group_by_(.dots = group1) %>%
    do(my_plots = my_plot(., group1))
plots1$my_plots[1]

enter image description here

group2 <- c("manufacturer", "year")
plots2 <- 
    mpg %>% 
    group_by_(.dots = group2) %>%
    do(my_plots = my_plot(., group2))
plots2$my_plots[2]

enter image description here