purrr::pluck - 如何获取列表的最后一个元素
purrr::pluck - how to get last element of list
我正在尝试提取嵌套列表的最后一个元素。我怎样才能用 purrr
做到这一点?在下面的示例中,结果应该是所有值为“c”的元素。
我看过 ,但我对 purrr 的解决方案特别感兴趣。
非常感谢
x <- list(list(1,2,"c"), list(3,"c"), list("c"))
x
#> [[1]]
#> [[1]][[1]]
#> [1] 1
#>
#> [[1]][[2]]
#> [1] 2
#>
#> [[1]][[3]]
#> [1] "c"
#>
#>
#> [[2]]
#> [[2]][[1]]
#> [1] 3
#>
#> [[2]][[2]]
#> [1] "c"
#>
#>
#> [[3]]
#> [[3]][[1]]
#> [1] "c"
map(x, purrr::pluck, tail)
#> Error in map(x, purrr::pluck, tail): could not find function "map"
map(x, purrr::pluck, length(x))
#> Error in map(x, purrr::pluck, length(x)): could not find function "map"
由 reprex package (v2.0.0)
于 2021-05-21 创建
这行得通吗:
map(x, function(y) y[[length(y)]])
[[1]]
[1] "c"
[[2]]
[1] "c"
[[3]]
[1] "c"
你在每个列表中都有一个嵌套列表,我不确定这是不是故意的。在当前状态下,这会起作用 -
library(purrr)
map(x, ~.x %>% unlist(recursive = FALSE) %>% tail(1))
#[[1]]
#[1] "c"
#[[2]]
#[1] "c"
#[[3]]
#[1] "c"
还有pluck
-
map(x, ~.x %>% unlist(recursive = FALSE) %>% pluck(length(.)))
使用 base R
(R 4.1.0
)
lapply(x, \(y) tail(y, 1)[[1]])
#[[1]]
#[1] "c"
#[[2]]
#[1] "c"
#[[3]]
#[1] "c"
简单地使用purrr::pluck
:
library(purrr)
map(x, ~ pluck(.x, length(.x)))
或者更容易使用 dplyr::last
:
library(purrr)
library(dplyr)
map(x, last)
仅在基础 R
中,反转每个列表元素并取第一项:
lapply(x, function(y) rev(y)[[1]])
lapply(x, \(y) rev(y)[[1]]) # R >= 4.1.0
或
mapply(`[[`, x, sapply(x, length), SIMPLIFY = F)
如果删除参数 SIMPLIFY = F
,这将是 return 单个向量,因为默认值为 TRUE
。
这通过并行迭代列表 x
和 sapply(x, length)
的输出并将其应用于作为提取运算符的函数 `[[`
来实现。
我正在尝试提取嵌套列表的最后一个元素。我怎样才能用 purrr
做到这一点?在下面的示例中,结果应该是所有值为“c”的元素。
我看过
非常感谢
x <- list(list(1,2,"c"), list(3,"c"), list("c"))
x
#> [[1]]
#> [[1]][[1]]
#> [1] 1
#>
#> [[1]][[2]]
#> [1] 2
#>
#> [[1]][[3]]
#> [1] "c"
#>
#>
#> [[2]]
#> [[2]][[1]]
#> [1] 3
#>
#> [[2]][[2]]
#> [1] "c"
#>
#>
#> [[3]]
#> [[3]][[1]]
#> [1] "c"
map(x, purrr::pluck, tail)
#> Error in map(x, purrr::pluck, tail): could not find function "map"
map(x, purrr::pluck, length(x))
#> Error in map(x, purrr::pluck, length(x)): could not find function "map"
由 reprex package (v2.0.0)
于 2021-05-21 创建这行得通吗:
map(x, function(y) y[[length(y)]])
[[1]]
[1] "c"
[[2]]
[1] "c"
[[3]]
[1] "c"
你在每个列表中都有一个嵌套列表,我不确定这是不是故意的。在当前状态下,这会起作用 -
library(purrr)
map(x, ~.x %>% unlist(recursive = FALSE) %>% tail(1))
#[[1]]
#[1] "c"
#[[2]]
#[1] "c"
#[[3]]
#[1] "c"
还有pluck
-
map(x, ~.x %>% unlist(recursive = FALSE) %>% pluck(length(.)))
使用 base R
(R 4.1.0
)
lapply(x, \(y) tail(y, 1)[[1]])
#[[1]]
#[1] "c"
#[[2]]
#[1] "c"
#[[3]]
#[1] "c"
简单地使用purrr::pluck
:
library(purrr)
map(x, ~ pluck(.x, length(.x)))
或者更容易使用 dplyr::last
:
library(purrr)
library(dplyr)
map(x, last)
仅在基础 R
中,反转每个列表元素并取第一项:
lapply(x, function(y) rev(y)[[1]])
lapply(x, \(y) rev(y)[[1]]) # R >= 4.1.0
或
mapply(`[[`, x, sapply(x, length), SIMPLIFY = F)
如果删除参数 SIMPLIFY = F
,这将是 return 单个向量,因为默认值为 TRUE
。
这通过并行迭代列表 x
和 sapply(x, length)
的输出并将其应用于作为提取运算符的函数 `[[`
来实现。