我有一个嵌套的监听,由一个函数产生。顶部元素名称在元素名称中进一步缩小。
$`1`
$`1`$`1`
[1] 0 0 0 0 0 0 0 1 0
$`1`$`2`
[1] 0 0 0 0 0 0 0 0 0
$`2`
$`2`$`1`
[1] 0 0 0 1 1 0 0 0 0
$`2`$`2`
[1] 0 1 0 0 0 1 0 0 0
是否有办法使用apply函数(或其他)来提取元素和子元素名称匹配的向量。例如。 $ 1
$ 1
和$ 2
$ 2
。我有一个巨大的列表(4000个元素和4000个子元素)因此效率是必须的。
或者 - 我已经通过使用'melt()'找到了解决这个问题的方法,但是对于我的设置大小来说太过消耗了。但是,如果有人知道如何复制效果 - 为elementname提供一个包含3列的数据帧,一个用于子元素名称,另一个用于向量 - 这也将起作用。
问候并感谢:)
答案 0 :(得分:4)
这是一种获取所需矢量列表的方法:
lapply(names(dat), function(x) dat[[x]][[x]])
在数据框中:
do.call("rbind",
lapply(names(dat),
function(x) data.frame(element = x,
subelement = x,
values = dat[[x]][[x]])
)
)
答案 1 :(得分:2)
您可以在没有递归的情况下unlist
删除顶级列表结构,然后对此结果的名称使用正则表达式辅助子集。
l <- list(`1`=list(`1`=rpois(6,1),`2`=rep(0,6)),`2`=list(`1`=rep(0,6),`2`=rpois(6,1)))
l2 <- unlist(l,recursive=F)
l2[grepl("([0-9]+)[.]\\1",names(l2))]
$`1.1`
[1] 2 0 2 4 1 0
$`2.2`
[1] 0 0 0 2 1 0