从任意嵌套列表中获取元素

时间:2018-10-01 08:24:34

标签: r list nested

我有一个像这样的嵌套列表:

nested_list = list(children = list(CV = "hello", 
                                   children = list(CV = "out", 
                                                   children = list(CV = "there", 
                                                                   TE = "blaa")), 
                                   TE = "hello",
                                   children = list(CV = "tom", 
                                                   TE = "lisa", 
                                                   children = list(TE = "bob"))), 
                   children = list(CV = "sam", 
                                   children = list(CV = "out", 
                                                   children = list(CV = "there", 
                                                                   TE = "blaa", 
                                                                   other = "other element"))))

,我需要提取所有以“ CV”或“ TE”命名的元素。可能还会有其他名称的元素,例如CV或TE。

名称为“ TE”或“ CV”的元素可以是列表本身,因此我需要提取列表。这是一些带有列表作为元素的输入,需要提取。

nested_list2 = list(children = list(CV = "hello", 
                                   children = list(CV = list(subject = "sub", value = list(key = "1", var = "45")), 
                                                   children = list(CV = "there", 
                                                                   TE = list(subject = "sub2")))))

问题是嵌套列表的深度级别未知。所以我需要一个可以在任何嵌套列表上使用的函数。

这是nested_list的预期输出:

exp_output = list(CV = "hello", 
                  CV = "out", 
                  CV = "there", 
                  TE = "blaa", 
                  TE = "hello", 
                  CV = "tom", 
                  TE = "lisa", 
                  TE = "bob", 
                  CV = "sam",
                  CV = "out", 
                  CV = "there", 
                  TE = "blaa")

这将是nested_list2的预期输出:

exp_output2 = list(CV = list("hello"),
                   CV = list(subject = "sub", value = list(key = "1", var = "45")),
                   CV = list("there"),
                   TE = list(subject = "sub2"))

我知道列表元素将没有唯一的名称,但是我需要这种结构。 有这样的功能吗?我什么都没找到。

任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

您可以使用附加列表的递归函数:

res <- list()
fun <- function(x, nms){
  if(any(names(x) %in% nms)){
    res <<- c(res,x[names(x) %in% nms])
    x <- x[!names(x) %in% nms]
  }
  if (is.list(x)) lapply(x,fun,nms)
}
fun(nested_list2, c("CV","TE"))

res <- list()
fun(nested_list, c("CV","TE"))
str(res)
# List of 12
# $ CV: chr "hello"
# $ TE: chr "hello"
# $ CV: chr "out"
# $ CV: chr "there"
# $ TE: chr "blaa"
# $ CV: chr "tom"
# $ TE: chr "lisa"
# $ TE: chr "bob"
# $ CV: chr "sam"
# $ CV: chr "out"
# $ CV: chr "there"
# $ TE: chr "blaa"

res <- list()
fun(nested_list2, c("CV","TE"))
str(res)
# List of 4
# $ CV: chr "hello"
# $ CV:List of 2
# ..$ subject: chr "sub"
# ..$ value  :List of 2
# .. ..$ key: chr "1"
# .. ..$ var: chr "45"
# $ CV: chr "there"
# $ TE:List of 1
# ..$ subject: chr "sub2"