仅当存在于每个子列表中时才使用 purrr::map 提取元素

Extract elements with purrr::map only if existing in each sublist

我有一个示例列表 list1,包含 3 个子列表 AlphaBetaGamma。这些子列表中的每一个都包含几个元素。但是,并非所有元素都在每个子组中。

list1 <- list(Alpha = structure(list(sample_0 = c(3, NA, 7, 9, 2),
                                     sample_1 = c(NA, 8, 5, 4, NA),
                                     sample_2 = c(7, 3, 5, NA, NA)),
                                row.names = c(NA, -5L),
                                class = c("tbl_df", "tbl", "data.frame")),
              Beta = structure (list(sample_0 = c(2, 9, NA, 3, 7),
                                     sample_1 = c(3, 7, 9, 3, NA),
                                     sample_2 = c(4, 2, 6, 4, 6)),
                                row.names = c(NA, -5L),
                                class = c("tbl_df", "tbl", "data.frame")),
              Gamma = structure(list(sample_0 = c(NA, NA, 4, 6, 3),
                                     sample_1 = c(3, 7, 3, NA, 8)),
                                row.names = c(NA, -5L),
                                class = c("tbl_df", "tbl", "data.frame")))

我想创建一个 list2,仅由 list1 的指定部分组成,例如仅包含两个元素 sample_1sample_2 的子列表。 我设法过滤出现在每个子列表中的元素,例如 sample_0:

map(list1, `[`, "sample_0")

## Output

$Alpha
# A tibble: 5 x 1
  sample_0
     <dbl>
1        3
2       NA
3        7
4        9
5        2

$Beta
# A tibble: 5 x 1
  sample_0
     <dbl>
1        2
2        9
3       NA
4        3
5        7

$Gamma
# A tibble: 5 x 1
  sample_0
     <dbl>
1       NA
2       NA
3        4
4        6
5        3

但是,当我尝试过滤每个子组中都不存在的子列表时,它会抛出一条错误消息:

map(list1, `[`, "sample_2")

Error in `stop_subscript()`:
! Can't subset columns that don't exist.
x Column `sample_2` doesn't exist.

我的最终目标是创建一个新列表,其中仅包含包含所有一组预先指定向量的子列表。理想情况下,这将通过将向量 extract_vars 传递给 purrr:map:

来完成
extract_vars <- c("sample_1", "sample_2")

期望的输出是:

$Alpha
# A tibble: 5 x 3
sample_1 sample_2
   <dbl>    <dbl>
1     NA        7
2      8        3
3      5        5
4      4       NA
5     NA       NA

$Beta
# A tibble: 5 x 3
sample_1 sample_2
   <dbl>    <dbl>
1      3        4
2      7        2
3      9        6
4      3        4
5     NA        6

(元素 Gamma 从所需列表中删除,因为它不包含元素 sampling_0)。

一个选项可以是:

map(keep(list1, ~ all(xtract_vars %in% names(.))), ~ select(., all_of(xtract_vars)))

$Alpha
# A tibble: 5 × 2
  sample_1 sample_2
     <dbl>    <dbl>
1       NA        7
2        8        3
3        5        5
4        4       NA
5       NA       NA

$Beta
# A tibble: 5 × 2
  sample_1 sample_2
     <dbl>    <dbl>
1        3        4
2        7        2
3        9        6
4        3        4
5       NA        6