如何在R中取消一个非常混乱的列表

时间:2015-07-31 01:12:14

标签: r list

我有一个非常混乱的列表,其中包含以下形式的多个级别:

[[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"))))

2 个答案:

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

答案 1 :(得分:1)

请尝试此功能。

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))))))

我刚刚在新提供的数据上测试过它,它运行正常。输出是(在输入之后):

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"))