我有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分钟才能超过我的初始矩阵)
答案 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分钟。