如何在R中取消列出一个非常混乱的列表[重复]
Posted
技术标签:
【中文标题】如何在R中取消列出一个非常混乱的列表[重复]【英文标题】:How to unlist a very messy list in R [duplicate] 【发布时间】:2015-10-22 13:37:53 【问题描述】:我有一个非常混乱的列表,其中包含多个级别:
[[1]]
[[1]][[1]]
[[1]][[1]][[1]]
[1] "D" "B" "A"
[[1]][[1]][[2]]
[1] "E" "B" "A"
[[1]][[2]]
[[1]][[2]][[1]]
[1] "D" "C" "A"
[[1]][[3]]
[[1]][[3]][[1]]
[1] "B" "D" "A"
....
[[5]][[2]][[2]]
[1] "D" "B" "E"
[[5]][[3]]
[1] "C" "E"
...
获取最低级别字符向量列表的最简单方法是什么,所以第一个元素是“D”“B”“A”,然后下一个元素是“E”“B”“A”和等等?
谢谢!
编辑: 这是我要求的 dput 格式的列表。但是,嵌套结构可以改变并且层数可以增加。因此,任何通过使用预设数量的级别来工作的解决方案都是不好的。
> dput(myResults)
list(list(list(c("D", "B", "A"), c("E", "B", "A")), list(c("D",
"C", "A")), list(c("B", "D", "A"), c("C", "D", "A"), c("E", "D",
"A")), list(c("B", "E", "A"), c("D", "E", "A"))), list(list(c("D",
"A", "B"), c("E", "A", "B")), c("C", "B"), list(c("A", "D", "B"
), c("E", "D", "B")), list(c("A", "E", "B"), c("D", "E", "B"))),
list(list(c("D", "A", "C")), c("B", "C"), list(c("A", "D",
"C")), c("E", "C")), list(list(c("B", "A", "D"), c("C", "A",
"D"), c("E", "A", "D")), list(c("A", "B", "D"), c("E", "B",
"D")), list(c("A", "C", "D")), list(c("A", "E", "D"), c("B",
"E", "D"))), list(list(c("B", "A", "E"), c("D", "A", "E")),
list(c("A", "B", "E"), c("D", "B", "E")), c("C", "E"),
list(c("A", "D", "E"), c("B", "D", "E"))))
【问题讨论】:
能否请您提供您的数据的dput
或reproducible example?子集嵌套列表有时非常棘手,没有一段代码很难帮助你。所需输出的可视化表示也非常有用。
修改生成此列表的代码可能更容易。
问题是我没有看到它——它已经传给了我……嗯,不过你的观点很好。我会跟进...我认为必须有一个函数可以到达基本级别并附加它
我打算建议u <- unlist(x); l <- rapply(x, length)
,然后根据l
中的长度拆分u
。但现在它是重复的。可能效率不高,但似乎更容易完成并且可能是安全的。
【参考方案1】:
编辑
有一个包rlist
有一个函数list.flatten
可以做到这一点
library(rlist)
list.flatten(yourLst)
递归解决方案(但顺序已更改,即首先出现嵌套最少的内容)
unlst <- function(lst)
if (!any((inds <- sapply(lst, is.list)))) return(lst)
c(lst[!inds], unlst(unlist(lst[inds], rec=F)))
【讨论】:
rlist::list.flatten
几乎是flatten2
中currently accepted answer 对这个重复的问题的逐字复制。
感谢您提醒我版权问题,作者应完全感谢rlist::list.flatten
的实施。刚刚推送了包含归属的文档。【参考方案2】:
请试试这个功能。
unlist_messy_list <- function(cur_list)
if (is.atomic(cur_list))
list(cur_list)
else
cl <- lapply(cur_list, unlist_messy_list)
Reduce(c, cl)
由于您没有提供样例数据,我用自己编的一些案例进行了测试,效果不错。
unlist_messy_list(list())
unlist_messy_list(list(c(1,2,3), c(4,5,6), c(7,8,9)))
unlist_messy_list(list(c(1,2,3), list(c(4,5,6), c(7,8,9))))
unlist_messy_list(list(c(1,2,3), c(4,5,6), list(c(7,8,9), c(10,11,12))))
unlist_messy_list(list(c(1,2,3), list(c(4,5,6), c(7,8,9), list(10, c(11,12,13), 14, list(c(15,16))))))
我刚刚在您新提供的数据上对其进行了测试,效果很好。输出是(在 dput 之后):
list(c("D", "B", "A"), c("E", "B", "A"), c("D", "C", "A"), c("B", "D", "A"), c("C", "D", "A"), c("E", "D", "A"), c("B", "E", "A"), c("D", "E", "A"), c("D", "A", "B"), c("E", "A", "B"), c("C", "B"), c("A", "D", "B"), c("E", "D", "B"), c("A", "E", "B"), c("D", "E", "B"), c("D", "A", "C"), c("B", "C"), c("A", "D", "C"), c("E", "C"), c("B", "A", "D"), c("C", "A", "D"), c("E", "A", "D"), c("A", "B", "D"), c("E", "B", "D"), c("A", "C", "D"), c("A", "E", "D"), c("B", "E", "D"),c("B", "A", "E"), c("D", "A", "E"), c("A", "B", "E"), c("D", "B", "E"), c("C", "E"), c("A", "D", "E"), c("B", "D", "E"))
【讨论】:
@PingJin 你可能会喜欢这个功能Recall
。以上是关于如何在R中取消列出一个非常混乱的列表[重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何在不增加行的情况下取消列出 R 和 inner_join 中的对象?