2017-10-09 10 views
0

リストの列にネストしているデータがある場合、ネストされたデータフレーム内の各列に個別にプロット関数を適用するために、purrr :: map()を使用したいと思います。 。最小限の再現性の例:ネストされたデータフレームの列に関数を適用する

library(dplyr) 
library(tidyr) 
library(purrr) 

data=data.frame(Type=c(rep('Type1',20), 
         rep('Type2',20), 
         rep('Type3',20)), 
       Result1=rnorm(60), 
       Result2=rnorm(60), 
       Result3=rnorm(60) 
       ) 

dataNested=data%>%group_by(Type)%>%nest() 

言って、私は結果1のヒストグラムを生成したい:dataNested $データの各要素についてResult3:

dataNested%>%map(data,hist) 

私のコードの任意の反復は、別途を反復しません各ネストされたデータフレーム内の列。

+0

'結果1のヒストグラムを生成する:Result3'はどういう意味ですか?連結データの1つのヒストグラム? 'Type'ごとに3つのヒストグラム? – liborm

答えて

2

なぜあなたはすでにtidyverseに入っているときに、このように複雑にする必要がありますか?リストの列が...むしろ問題への最後のソリューションです

library(tidyverse) 

data %>% 
    gather(result, value, -Type) %>% 
    ggplot(aes(value)) + 
    geom_histogram() + 
    facet_grid(Type ~ result) 

gatherType列、result列と、すべての数字があるvalue列、で、長いものに幅広いデータセットを再フォーマットします。

+0

私のアプリケーションは、データと出力が何であるかという点では、かなり広い範囲にあります。 purrrの複雑さは、出力の点で私を多く救います。 – scs217

+0

複雑さが増すということは、データを長方形の形に保つことがさらに重要であることを意味します;複雑な問題には簡単な解決策が必要です。 – liborm

+0

私は値を計算し、それらのリストを引数として出力に渡す必要があります。それが、私が欲しいものです。 – scs217

2

おそらく、ネストされたデータフレームを作成しないでください。 Type列でデータフレームを分割し、ヒストグラムをプロットすることができます。

library(tidyverse) 

dt %>% 
    split(.$Type) %>% 
    map(~walk(.[-1], ~hist(.))) 

DATA

library(tidyverse) 

set.seed(1) 

dt <- data.frame(Type = c(rep('Type1', 20), 
          rep('Type2', 20), 
          rep('Type3', 20)), 
       Result1 = rnorm(60), 
       Result2 = rnorm(60), 
       Result3 = rnorm(60), 
       stringsAsFactors = FALSE) 
+0

すべての3x3ヒストグラムを表示するには、グラフィックパラメータをリセットするために 'op

1

だから私は、あなたがこのことについて正しい方法を考えていると思います。このコードを実行する:

dataNested$data[[1] 

あなたはあなたが反復できるデータがあることがわかります。

for(i in dataNested) { 
print(i) 
} 

これは、構造があまりにも複雑すぎることを明確に示しています。さて、どのようにヒストグラムを作成するのですか?私たちは、ヘルパー関数を作成することができます

helper_hist <- function(df) { 
       lapply(df, hist) 
} 

をそして使用して実行します。このことができます

map(dataNested$data, helper_hist) 

希望を。

関連する問題