我有一个 list :
ls <- list(c("a", "b", "c"), c("1", "2", "3"), c("foo", "bar", "baz"))
ls
#> [[1]]
#> [1] "a" "b" "c"
#> [[2]]
#> [1] "1" "2" "3"
#> [[3]]
#> [1] "foo" "bar" "baz"
我希望“转置”为:
resulting_ls
#> [[1]]
#> [1] "a" "1" "foo"
#> [[2]]
#> [1] "b" "2" "bar"
#> [[3]]
#> [1] "c" "3" "baz"
我可以通过以下方式实现这一点:
mat <- matrix(unlist(ls), ncol = 3, byrow = TRUE)
resulting_ls <- lapply(1:ncol(mat), function(i) mat[, i])
但是对于我的真实数据来说,它非常慢......(并且我需要对许多列表执行此操作,每个列表都比上面的示例大得多)
我的问题:
对于大型列表 length(ls)
和/或 length(ls[[i]])
执行此操作的最快方法是什么?
- 在
R
中(如果情况还不是这样的话) - 与
Rcpp
最佳答案
在 data.table
包中,有一个 transpose()
函数正是执行此操作。为了提高速度,它是用 C
实现的。
require(data.table) # v1.9.6+
transpose(ls)
# [[1]]
# [1] "a" "1" "foo"
# [[2]]
# [1] "b" "2" "bar"
# [[3]]
# [1] "c" "3" "baz"
如果列表元素长度不等,它还会自动填充 NA
,并且还会自动强制为最高的 SEXPTYPE。如有必要,您可以为 fill
参数提供不同的值。检查?转置
。
关于r - 在 R/Rcpp 中转置列表的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30164803/