在R / Rcpp中转置列表的最快方法

问题描述 投票:8回答:2

我有一个清单:

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]]),最快的方法是什么?

  1. R中(如果不是这种情况)
  2. 带有Rcpp
  3. 我有一个列表:ls [[1]]#> [1]“ a”“ b”“ c”#> [[2]]#> [1]“ 1”“ 2”“ 3”#> [[3]]#> [1]“ foo”“ bar”“ ...

r performance rcpp
2个回答
15
投票

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"

6
投票

“ list”是没有C等效项的R对象,因此在C中对其进行操作将仅在周围计算方面提高效率,因为实际的转置将需要在R对象之间来回进行。阿伦(Arun)的transpose是解决此问题的一种简洁方法,看似无法改善。我将提供其他一些选择,只是为了表明转置“列表”可能很奇怪,也许采用其他方法来实现最终目标可能会更好。

© www.soinside.com 2019 - 2024. All rights reserved.