我有一个 nxp 非常稀疏的计数矩阵,只有非负值和名为 y_1, ... , y_p 的列。(n=200 万,p=70)
我想使用 R 将它转换为一个矩阵,该矩阵计算 y_i 和 y_j 在同一行上具有非零值的次数。
例子:
ID a b c d e
1 1 0 1 0 0
2 0 1 1 0 0
3 0 0 1 1 0
4 1 1 0 0 0
我想获得:
- a b c d e
a 2 1 1 0 0
b 1 2 1 0 0
c 1 1 3 1 0
d 0 0 1 1 0
e 0 0 0 0 0
这是一个简单的矩阵乘法。
t(m) %*% m
a b c d e
a 2 1 1 0 0
b 1 2 1 0 0
c 1 1 3 1 0
d 0 0 1 1 0
e 0 0 0 0 0
使用这些数据:
m = read.table(text = "ID a b c d e
1 1 0 1 0 0
2 0 1 1 0 0
3 0 0 1 1 0
4 1 1 0 0 0", header = T)
m = as.matrix(m[, -1])
这依赖于原始矩阵只有 1 和 0。如果不是,您可以创建它m = original_matrix > 0
这是它在您描述的矩阵上工作:
library(Matrix)
nr = 2e6
nc = 70
mm = Matrix(0, nrow = nr, ncol = nc, sparse = T)
# make, on average, three 1s per row
set.seed(47)
mm[cbind(sample(nr, size = 3 * nr, replace = T), sample(nc, size = 3 * nr, replace = T))] = 1
system.time({res = t(mm) %*% mm})
# user system elapsed
# 0.836 0.057 0.895
format(object.size(res), units = "Mb")
[1] "0.1 Mb
在我的笔记本电脑上,计算时间不到一秒钟,结果约为 0.1 Mb。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句