【问题标题】:How to get last subelement of every element of a list?如何获取列表中每个元素的最后一个子元素?
【发布时间】:2016-03-21 22:52:32
【问题描述】:

我正在尝试获取列表的每个子元素的 last 元素的值。列表的元素是不同长度的向量,所以最后一个子元素的索引在列表的元素之间不是恒定的。

我已经搜索过 SO,但只找到了那些希望获得的信息,for example, the second sub-element of every element。这对我没有帮助,因为列表的元素长度不定。

我只对不涉及使用 for 循环的解决方案感兴趣,因为我的列表长度 > 100 万。

示例数据:

x <- list(a = 1:5, b = 1:10, d = 9:11)

预期输出是一个列表:list(5, 10, 11)

【问题讨论】:

  • lapply(mtcars, function(x){x[length(x)]})?这在一定程度上取决于列表的结构。
  • 另一个有趣的选项是mapply('[[', x, lengths(x))

标签: r list


【解决方案1】:

我们可以使用lapplytail

x <- list(a = 1:5, b = 1:10, d = 9:11)
last_elems <- lapply(x, tail, n = 1L)

正如 cmets 中所指出的,要获得数字向量而不是单元素列表,vapply 是一个不错的选择:

last_elems <- vapply(x, tail, n = 1L, FUN.VALUE = numeric(1))

【讨论】:

  • 由于单元素向量列表有点不受欢迎,我们也可以使用vapply(x, tail, 1L, 1L) 快速获得原子向量结果(或sapply())。
  • 我很好奇是否可以使用sapply(x, "[", sapply(x, length)) 之类的东西(不幸的是,它返回了一个矩阵,但它越来越接近了)
【解决方案2】:

使用 purrr::map2:

library(purrr)

x <- list(a = 1:5, b = 1:10, d = 9:11)
map2(x, lengths(x), pluck)
# $a
# [1] 5
# 
# $b
# [1] 10
# 
# $d
# [1] 11

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-19
    • 2010-10-30
    • 2022-11-15
    • 2011-02-17
    • 1970-01-01
    • 1970-01-01
    • 2020-08-04
    相关资源
    最近更新 更多