根据R中的条件选择列表的嵌套子列表

时间:2017-11-13 10:00:59

标签: r list filter

我确实有以下嵌套列表的简单示例:

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"的方法。

3 个答案:

答案 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
相关问题