我确实有以下嵌套列表的简单示例:
list(list(structure(list(group = "a", def = "control"), .Names = c("group",
"def"))), list(structure(list(group = "b", def = "disease1"), .Names = c("group",
"def"))))
结构如下:
str(t1)
List of 2
$ :List of 1
..$ :List of 2
.. ..$ group: chr "a"
.. ..$ def : chr "control"
$ :List of 1
..$ :List of 2
.. ..$ group: chr "b"
.. ..$ def : chr "disease1"
是否有一种简单的方法可以只获得满足特定条件的嵌套列表。例如,如果我只知道组的名称,例如“a”,我将如何获得相应的子列表;在示例中,这将是第一个嵌套列表:
[[1]]
[[1]]$group
[1] "a"
[[1]]$def
[1] "control"
所以基本上我正在寻找一种在这个嵌套列表结构中应用group == "a"
的方法。
答案 0 :(得分:2)
我们可以使用lapply
提取列表的子列表。我们也可以写一个函数。
get_sublist <- function(group_name) {
lst[lapply(lst, function(x) x[[1]][[1]]) == group_name]
}
get_sublist("a")
#[[1]]
#[[1]][[1]]
#[[1]][[1]]$group
#[1] "a"
#[[1]][[1]]$def
#[1] "control"
get_sublist("b")
#[[1]]
#[[1]][[1]]
#[[1]][[1]]$group
#[1] "b"
#[[1]][[1]]$def
#[1] "disease1"
答案 1 :(得分:0)
我们可以转换为tibble
然后使用map
创建一个逻辑向量来对'lst'进行子集
library(purrr)
library(magrittr)
library(tibble)
lst %>%
map_lgl(., ~map_lgl(., ~as.tibble(.) %>%
.$group=='a')) %>%
extract(lst, .) %>%
.[[1]]
#[[1]]
#[[1]]$group
#[1] "a"
#[[1]]$def
#[1] "control"
或使用modify_depth
lst %>%
modify_depth(., 2, ~as.tibble(.)[['group']]=='a') %>%
unlist %>%
extract(lst, .)
在此,我们假设“组”的位置可以在list
中更改。
答案 2 :(得分:0)
除了已经提供的答案之外,我还设法使用&#34; keep&#34;来获得正确的结果。来自&#34; purrr&#34;图书馆:
DEFAULT VALUE