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

标签 r performance rcpp

我有一个 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]]) 执行此操作的最快方法是什么?

  1. R 中(如果情况还不是这样的话)
  2. 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/

相关文章:

java - HashMap用作Cache时的性能问题

r - dplyr::select - 多次使用列?

r - R 中的比例树形图

javascript - 如何在 Javascript 中预分配密集数组?

r - 使用外部指针进行奇怪的访问

oop - 将 RInside 的 'R' 实例作为类/方法之间的参数传递

c++ - 使用 Rcpp/RcppArmadillo : Can't identify exactly what is wrong after debugging with valgrind 运行我的 C++ 代码时出现内存错误

r - 使用 dplyr 将行添加到分组数据中?

r - 如何在R中获取函数调用的行号?

c# - 结构元组的性能