【发布时间】:2020-05-10 21:05:43
【问题描述】:
我有一个包含 3 个向量的列表,例如:
> test_list
[[1]]
[1] "a" "b"
[[2]]
[1] "c" "d" "e"
[[3]]
[1] "f" "g"
我想使用包含向量索引的数组来访问这些向量的元素,例如:
> indices
[,1] [,2] [,3]
[1,] 1 3 2
[2,] 2 2 2
这是所需的输出:
[,1] [,2] [,3]
[1,] "a" "e" "g"
[2,] "b" "d" "g"
我找到了以下方法:
test_list <- list(c("a", "b"), c("c", "d", "e"), c("f", "g"))
indices <- matrix(c(1, 3, 2, 2, 2, 2), nrow = 2, ncol = 3, byrow = TRUE)
t(apply(indices, 1, function(row){mapply(`[[`, test_list, row)}))
有没有更干净、更惯用的方式?
【问题讨论】:
-
可能是
mapply("[",test_list,as.data.frame(indices))。 -
我可能会写成
sapply(seq_along(test_list), function (i) test_list[[i]][indices[, i]]),但实际上更长。但它 (a) 只使用一个高阶函数,即它不嵌套循环,它 (b) 不双重转置隐式矩阵,因此它在概念上更简单。 (实际上我会使用lapply而不是容易出错的sapply,然后将结果显式转换为矩阵,但这甚至更长)。
标签: r arrays list vector indexing