2017-02-14 137 views
1

將名稱(或標記)傳遞給lapply允許在該函數內訪問元素名稱(根據給出的解決方案here)。如何應用相同的方法來處理列表清單?在下面的例子中,每個列表元素(「A」和「B」)本身就是一個列表,其中包含多個已命名的數據框(「df_001」等等)。輸出列表中的列表的元素名稱

list_of_lists <- list("A" = list("df_001" = data.frame(X = 1, Y = 1), "df_002" = data.frame(X = 1, Y = 2), "df_003" = data.frame(X = 2, Y = 1)), 
         "B" = list("df_004" = data.frame(X = 1, Y = 1), "df_005" = data.frame(X = 1, Y = 2), "df_006" = data.frame(X = 2, Y = 1))) 

我想申請,每個這些dataframes的,它可以粘貼它的兩個數據幀名稱(例如「df_001」)和它的父列表名稱(例如,「A」)的功能。例如,爲每個數據幀生成一個標題爲「A:df_001」或「B:df_004」的繪圖等

我可以爲每個單獨列表元素(「A」或「B」)執行此操作,如下所示

plot_with_name <- function(z) { 
    dat <- list_of_lists[["A"]][[z]] 
    plot(dat[, 1], dat[, 2], 
     main = paste("A: ", z)) 
} 
lapply(names(list_of_lists[["A"]]), plot_with_name) 
# then repeat, replacing "A" with "B" 

但我很好奇這是否可以不需要拆分清單。

我的原始想法是使用嵌套lapply調用。下面的嘗試將一個函數應用於所有數據框,但不會調用名稱。也許它可以這樣做(?)

lapply(list_of_lists, lapply, function(x) { plot(x[, 1],x[, 2]) }) # generates plots WITHOUT names 

任何幫助,非常感謝。由於

+1

這是一個有點的變通,但如何:'UL < - unlist(list_of_lists,rec = FALSE); Map(函數(d,n)plot(d [,1],d [,2],main = n),ul,names(ul))'? – thelatemail

+0

另一種解決方法:'library(data.table);庫(GGPLOT2); ggplot(熔化(list_of_lists),aes(x =變量,y =值))+ geom_boxplot()+ facet_wrap(〜交互(L1,L2))' – Henrik

+0

謝謝大家的建議。我選擇了@ Chirayu's作爲解決方案,儘管我非常欣賞這與'Map()'建議相當 – pyg

回答

1

到thelatemail anwser類似:

xx=unlist(list_of_lists, recursive=FALSE) 
mapply(plot, x = xx, main = names(xx), SIMPLIFY = FALSE) 
0

不是最完美的解決方案,但它的工作原理:

nms_list <- names(list_of_lists)  

for (i in seq_along(nms_list)) { 
    m <- length(list_of_lists[[nms_list[i]]]) 
    for (l in 1:m) { 
    dat <- list_of_lists[[nms_list[i]]][[l]] 
    plot(dat[, 1], dat[, 2], 
     main = paste(nms_list[i],":", names(list_of_lists[[nms_list[i]]])[l])) 
    } 
} 
相關問題