2016-05-11 9 views
0

dplyr::do()というdata.frameのサブグループに対してプロット関数を呼び出して、サブグループごとに1つのFigure(ggplotオブジェクト)を生成しようとしています。 I グループ化変数に基づいて各図のタイトルが必要です。これを行うには、私の関数はグループ化変数が何であるかを知る必要があります。do()によって呼び出される関数内からグループ化変数を見つける

は現在、どのような.としてdo()に渡されると、クラスtbl_dfdata.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(.)) 
+0

あなたは '試してみました既に、「facet_wrap」はありますか?実際に別のプロットが必要な場合は、グループ化変数でdata.frame splitを実行してプロット関数を適用することができますが、確かに他のアプローチがあります。 – alistaire

答えて

2

私は(私は、グループ化変数は「VARS」と思う属性はgrouped_dfのdata.frameを分割した後に失われた機能の中にグループ化変数(複数可)の名前を渡さずにこれを行うにはその可能性はないと思います"do"を実行する前に)。ここでdplyr GROUP_BY%>%チェーンを行う適用する前にベクトルにグループ化変数(複数可)を定義する必要が代替ソリューションです:

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

関連する問題