我有一个像这样的嵌套列表:
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"))
我知道列表元素将没有唯一的名称,但是我需要这种结构。 有这样的功能吗?我什么都没找到。
任何帮助表示赞赏。
答案 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"