我有一个清单:
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
我有一个列表:ls [[1]]#> [1]“ a”“ b”“ c”#> [[2]]#> [1]“ 1”“ 2”“ 3”#> [[3]]#> [1]“ foo”“ bar”“ ...
在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"
“ list”是没有C等效项的R对象,因此在C中对其进行操作将仅在周围计算方面提高效率,因为实际的转置将需要在R对象之间来回进行。阿伦(Arun)的transpose
是解决此问题的一种简洁方法,看似无法改善。我将提供其他一些选择,只是为了表明转置“列表”可能很奇怪,也许采用其他方法来实现最终目标可能会更好。