R使用值作为索引的有效方法

时间:2014-11-12 13:22:47

标签: r performance

我有10M行matrix,其中包含整数值

matrix中的一行可以如下所示:

1 1 1 1 2

我需要将上面的行转换为以下向量:

4 1 0 0 0 0 0 0 0

其他例子:

1 2 3 4 5

要:

1 1 1 1 1 0 0 0 0

如何在R中高效完成  ?

更新 有一个功能完全符合我的需要:base::tabulate(之前建议) 但它非常慢(至少需要15分钟才能超过我的初始矩阵)

1 个答案:

答案 0 :(得分:2)

我会尝试这样的事情:

m <- nrow(x)
n <- ncol(x)
i.idx <- seq_len(m)
j.idx <- seq_len(n)

out <- matrix(0L, m, max(x))

for (j in j.idx) {
   ij <- cbind(i.idx, x[, j])
   out[ij] <- out[ij] + 1L
} 

对于要求有效实施的问题,for循环可能听起来令人惊讶。但是,此解决方案针对给定列进行矢量化,并且仅循环通过五列。这比使用apply循环超过1000万行要快很多倍。

测试:

n <- 1e7
m <- 5
x <- matrix(sample(1:9, n*m, T), n ,m)

这种方法花费的时间少于6秒,而幼稚的t(apply(x, 1, tabulate, 9))则需要接近2分钟。