仅当存在于每个子列表中时才使用 purrr::map 提取元素
Extract elements with purrr::map only if existing in each sublist
我有一个示例列表 list1
,包含 3 个子列表 Alpha
、Beta
、Gamma
。这些子列表中的每一个都包含几个元素。但是,并非所有元素都在每个子组中。
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_1
和 sample_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
我有一个示例列表 list1
,包含 3 个子列表 Alpha
、Beta
、Gamma
。这些子列表中的每一个都包含几个元素。但是,并非所有元素都在每个子组中。
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_1
和 sample_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