如何在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 中展平或取消列出数据框

如何在不增加行的情况下取消列出 R 和 inner_join 中的对象?

如何在 R 数据框中取消嵌套列表,同时保留键和值?

将数组从matlab导入R

如何在保留列表名称和值的同时展平一列列表? [r] [重复]

如何列出列中的所有值,然后在子查询中不重复就列出?