2

我正在尝试提取嵌套列表的最后一个元素。我该怎么做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 包于 2021-05-21 创建 (v2.0.0 )

4

4 回答 4

5

简单地使用purrr::pluck

library(purrr)

map(x, ~ pluck(.x, length(.x)))

甚至更容易使用dplyr::last

library(purrr)
library(dplyr)

map(x, last)

在 baseR中,反转每个列表元素并获取第一项:

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.

这通过迭代您的列表x和并行的输出sapply(x, length)并将其应用于`[[`作为提取运算符的函数来工作。

于 2021-05-21T20:20:28.093 回答
3

您在每个列表中都有一个嵌套列表,我不确定它是否是故意的。在当前状态下,这将起作用 -

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(.)))
于 2021-05-21T13:54:56.567 回答
3

这会起作用吗:

map(x, function(y) y[[length(y)]])
[[1]]
[1] "c"

[[2]]
[1] "c"

[[3]]
[1] "c"
于 2021-05-21T08:17:09.987 回答
3

使用base R( R 4.1.0)

lapply(x, \(y) tail(y, 1)[[1]])
#[[1]]
#[1] "c"

#[[2]]
#[1] "c"

#[[3]]
#[1] "c"
于 2021-05-21T19:57:03.370 回答