2017-09-20 7 views
0

プロットを含む名前付きリストを作成したいと思います。すべての情報を含むマスターデータフレームをフィルタリングするために使用する一意のIDを含むベクトルからリストを作成します。ggplotsを新規リストに作成して既存リストの名前で追加する機能

次に、lapplyでユニークIDのリストをループして、マスタデータフレームをフィルタリングしてプロットを作成するための関数を用意しました。次に、各プロットを(最初に)初期化されたリストに追加したいので、リスト項目の名前をlapplyで渡されたリスト値と等しくしたいと思います。

以下のコードはプロットを作成しますが、追加されたリストには、渡されたリストID値の対応する名前がありません。

私は間違ったアプローチをしていますか?私は名前(リスト)などを使用する質問/答えを見ましたが、lapplyに渡されたリストには名前が付けられません。新しいリストの名前になるようにリスト項目を渡します。

ありがとうございます!

library(ggplot2) 
library(dplyr) 

unique_names = as.list(c("apple", "banana", "carrots")) 
listy = list() 
dframe = data.frame(x_var = seq(1:9)) %>% 
    mutate(y_var = x_var^3) 
temp = data.frame(id = c("apple", "apple", "apple", "banana", "banana", "banana", "carrots", "carrots", "carrots")) 
dframe = bind_cols(dframe, 
        temp) 

fun_plots = function(my_list, 
        my_df, 
        my_appending_list) { 
    a = filter(my_df, 
      id == my_list) 
    plt = ggplot() + 
    geom_line(data = a, 
       aes(x = x_var, 
        y = y_var)) 

    my_appending_list$my_list = plt 
} 

plot_list = lapply(unique_names, 
        fun_plots, 
        my_df = dframe, 
        my_appending_list = listy) 

答えて

1

それは実際にあなたが関数内でlistyオブジェクトを変更していない、現時点では何も達成しないとあなたはmy_appending_list引数を取ることができます。あなただけ行うことができます。

fun_plots = function(my_list, 
        my_df) { 
    a = filter(my_df, 
       id == my_list) 
    plt = ggplot() + 
     geom_line(data = a, 
        aes(x = x_var, 
         y = y_var)) 

    plt 
} 

plot_list = lapply(unique_names, 
        fun_plots, 
        my_df = dframe) 
names(plot_list) = unique_names 
+0

lapplyはalistに 'fun_plots'を設定していますので、' listy'は必要ありません...ありがとう! 'fun_plots'の中でリスト要素の名前を設定する方法はありますか?私はlapplyが 'fun_plots'を使ってリスト要素を作成しているからではないと思います...それは正しい考えですか? – Prevost

0

あなたはこれを達成するためにdplyr GROUP_BYを使用することができます。

library(ggplot2) 
library(dplyr) 

unique_names = as.list(c("apple", "banana", "carrots")) 
listy = list() 
dframe = data.frame(x_var = seq(1:9)) %>% 
    mutate(y_var = x_var^3) 
temp = data.frame(id = c("apple", "apple", "apple", "banana", "banana", "banana", "carrots", "carrots", "carrots")) 
dframe = bind_cols(dframe, 
        temp) 

dframe <- group_by(dframe, id) %>% do(plots=ggplot(data=.) + 
           aes(x=x_var, y=y_var) + geom_line() + ggtitle(unique(.$id))) 

mylist <- as.list(dframe$plots) 

mylist 

HTHジェームズ

2

あなたが関数を記述し、dplyrもう少しでリストを変異避けることができますマジック。私が正しく理解していれば、 "id"変数の値ごとに個別のプロットオブジェクトが必要です。もしそうなら、 "id"にgroup_byを実行して、各セットに対してggplotオブジェクトを生成することができます。ここにある方法

plot_df <- dframe %>% 
    group_by(id) %>% 
    do(plot = ggplot(.data) + geom_line(aes(x = x_var, y = y_var)) + ggtitle(.data$id)) 
plot_df 
#> Source: local data frame [3 x 2] 
#> Groups: <by row> 
#> 
#> # A tibble: 3 x 2 
#>  id  plot 
#> * <fctr> <list> 
#> 1 apple <S3: gg> 
#> 2 banana <S3: gg> 
#> 3 carrots <S3: gg> 

id変数で1つのggplot2を持つことができます。例えば、:

ggplot(dframe) + geom_line(aes(x = x_var, y = y_var)) + facet_wrap(~ id) 
+0

それは私が存在することを知らなかったので、かなり素晴らしいです!ありがとう!私は 'knitr'(ラテックス)で実際にプロットしています。なぜなら、' listname $ plotname'を使ってプロットを呼び出せるようにするために、リストからプロットするプロットと、どこからプロットするのかを視覚的に示すことができたからです。 – Prevost

+0

ええ@Prevost、あなたがしようとしていることに応じて、1つのプロットでより良いかもしれません。 'facet_grid'と' facet_wrap'(両方ともggplot2の部分)の素敵なことは、あなたが面する変数の値で各パネルにラベルを付けることです。例えば、 "apple"、 "banana" 、および "ニンジン"が含まれる。実際には3つの別々のプロットが必要な場合を除き、これは簡単です。 – beigel

+0

次回は 'dplyr'' do'関数を使ってデータフレーム内のすべてのプロットを作成し、各エントリが行と等しいリストを作成し、そこからggplotを呼び出します。リストの名前を一意の名前のデータフレーム列と同じに設定します。すでに存在するものを使用して、カスタム関数を作成せずにすべてを達成する方法があると思います! – Prevost

関連する問題