purrr::pluck - 如何获取列表的最后一个元素

问题描述

我正在尝试提取嵌套列表的最后一个元素。如何使用 purrr 执行此操作?在下面的示例中,结果应该是值为“c”的所有元素。 我见过 this,但我对 purrr 的解决方案特别感兴趣。

非常感谢

x <- list(list(1,2,"c"),list(3,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,tail): Could not find function "map"
map(x,length(x))
#> Error in map(x,length(x)): Could not find function "map"

reprex package (v2.0.0) 于 2021 年 5 月 21 日创建

解决方法

简单地使用 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 将返回单个向量,因为默认值为 TRUE

这是通过并行迭代您的列表 xsapply(x,length) 的输出并将其应用于函数 `[[`(提取运算符)来实现的。

,

这行得通吗:

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(.)))