选择嵌套列表的第一个元素


86

假设我有一个这样的列表:

x = list(list(1,2), list(3,4), list(5,6))

我想要一个仅包含嵌套列表的第一个元素的列表。我可以这样返回另一个列表来做到这一点

x1 = lapply(x, function(l) l[[1]])

有快捷方式吗?

Answers:


137

捷径不多,但是您可以这样做:

lapply(x, `[[`, 1)
# [[1]]
# [1] 1
#
# [[2]]
# [1] 3
#
# [[3]]
# [1] 5

1
我同意它看起来确实更酷。我希望会有一个更短的方法来做到这一点,但我会选择一个凉爽的方法!
亚历克斯

@ A5C1D2H2I1M1N2O1R2T1我很欣赏干净和短促,但是您可以解释一下“ [[”吗?我发现在lapply中没有任何有用的东西
Mehrad Mahmoudian

2
@MehradMahmoudian,一个更好看的地方是“提取”(stat.ethz.ch/R-manual/R-devel/library/base/html/Extract.html)。
A5C1D2H2I1M1N2O1R2T1 '04年

43

另一种可能性使用漂亮的purrr库:

library(purrr)
map(x, 1)

5
对于那些想知道的人,这是有效的,因为map[[
它将

11

对于您的示例列表,您可以执行以下操作:

unlist(x)[ c(TRUE,FALSE) ]

但这取决于每个子列表中到底有2个元素。

如果元素数量不同,那么您可以先sapply进行计算以计算长度,然后计算相应的第一个元素位置(请参阅参考资料cumsum),然后从unlisted列表中选择这些值。但是到那时,公认的答案可能会简单得多。

如果所有子列表的长度都相同(但可以不同于2),则可以执行以下操作:

do.call( rbind, x)[,1]

或其他投射到同一对象的对象。但是我怀疑这种方法是否会有效lapply


2

我们可以使用pluckrvest从每个嵌套的列表中选择第1个要素

rvest::pluck(x, 1)
#[[1]]
#[1] 1

#[[2]]
#[1] 3

#[[3]]
#[1] 5

请注意,这样做会产生不同的结果,pluck从中purrr选择第一个元素(x[[1]]

purrr::pluck(x, 1)

#[[1]]
#[1] 1

#[[2]]
#[1] 2

0

不完全是一个简短的符号,但是也可以通过折叠来实现:

Reduce(function(a, b) c(a, b[1]), x, init = c()) 

# [[1]]
# [1] 1
# 
# [[2]]
# [1] 3
# 
# [[3]]
# [1] 5
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.