【发布时间】:2015-05-27 15:35:27
【问题描述】:
使用rmatio 包,我得到类似于以下的嵌套列表:
nestedlist <- list(
a = list( a = list(1:10), b = list(35)),
b = list(11:25)
)
理想情况下,我希望它看起来像这样(所有列表中的单个未命名元素都被该元素替换):
nestedlist <- list(a = list(a=1:10, b=35), b = 11:25)
我尝试了以下已经尝试过的:
unlist(nestedlist) # returns one vector with all elements
selective_unlist <- function(e)
if(is.list(e) &&is.null(names(e))) unlist(e) else e
# only calls the function with each leaf, so nothing gets replaced
rapply(nestedlist, how='replace', selective_unlist)
# works, but only for 2 levels
lapply(nestedlist, selective_unlist)
# works, but using explicit recursion is slow for large datasets
recursive_selective_unlist <- function(e)
if(is.list(e)) {
if(is.null(names(e))) unlist(e)
else lapply(e, recursive_selective_unlist)
} else e
有没有更好/更快的方法来简化这些嵌套列表,或者递归函数是我最好的选择?
【问题讨论】:
-
指定
recursive=FALSE当你只有一个嵌套程度时应该可以解决问题(如在你的示例对象中) -unlist(nestedlist,recursive=F)。 -
@nrussell 感谢您的建议,但有些文件最多有 8 个级别
-
@Frank 我忘了在编辑中更新它,现在已经更正了
-
可能与 2002 年相关的 convo:stat.ethz.ch/pipermail/r-help/2002-June/022349.html 作者说他找到了“仅在终端节点上应用功能”的解决方案,但没有提供它,而是选择了死链接并“给我发电子邮件” "。
标签: r