输出lapply中列表列表的元素名称

时间:2017-02-14 03:58:45

标签: r lapply

将名称(或指示)传递给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)))

我想在每个数据框中应用一个功能,可以粘贴其数据框名称(例如&#34; df_001&#34;)及其父列表名称(例如&#34; A& #34)。例如,为每个数据框生成一个标题相同的标题&#34; A:df_001&#34;或者&#34; B:df_004&#34;等

我可以为每个单独的列表元素(&#34; A&#34;或&#34; B&#34;)执行此操作,如下所示

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

非常感谢任何帮助。感谢

2 个答案:

答案 0 :(得分:1)

与thelatemail anwser类似:

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

答案 1 :(得分: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]))
  }
}