2017-10-09 67 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直方圖:Result3爲dataNested $數據的每個元素:

dataNested%>%map(data,hist) 

我的代碼的任何迭代不會單獨在迭代每個嵌套數據框中的列。

+0

'爲Result1生成直方圖:Result3'究竟意味着什麼?連接數據的一個直方圖?每個'Type'有三個直方圖? – liborm

回答

2

當你已經在tidyverse中時,爲什麼你需要以這種方式使事情複雜化?列表中的行,而最後的手段解決問題..

library(tidyverse) 

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

gather重新格式化寬數據集到一個漫長的,與Type列,result列和value列,所有的數字。

+0

我的應用程序在數據和我的輸出數據方面的範圍更大。就產出而言,嗚嗚聲的複雜性爲我省下了很多麻煩。 – 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 < - par(mfrow = c(3,3))'並在繪圖之後,'par(op)'重置圖形參數。 –

1

所以,我認爲你是在思考這個正確的方式。運行此代碼:

dataNested$data[[1] 

您可以看到您有可以迭代的數據。你可以像這樣循環:

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

這清楚地表明,結構沒有太複雜的工作。好,那麼如何創建直方圖?我們可以創建一個輔助函數:

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

並採用運行:

map(dataNested$data, helper_hist) 

希望這有助於。