我有一个非常大的稀疏矩阵,看起来像:
client item_1 item_2 item_3.... item_n
a 1 0 0 0
a 0 0 1 0
b 0 1 0 0
b 1 0 0 0
依旧......
我想通过客户端列聚合矩阵以获取:
client item_1 item_2 item_3.... item_n
a 1 0 1 0
b 1 1 0 0
我试图转换回密集矩阵然后聚合,但遇到内存问题。
我的数据看起来像
new("dgCMatrix"
, i = c(0L, 1L, 2L, 3L, 0L, 3L, 2L, 1L)
, p = c(0L, 4L, 6L, 7L, 8L, 8L)
, Dim = 4:5
, Dimnames = list(NULL, c("client", "item_1", "item_2", "item_3", "item_n"
))
, x = c(1, 1, 2, 2, 1, 1, 1, 1)
, factors = list()
)
答案 0 :(得分:1)
稀疏矩阵的矩阵乘法解决了这个问题(您的矩阵为b):
fac2sparse(b[,1]) %*% b[,-1]
区别在于现在可以将客户列作为行名。
通过单个阶乘变量进行汇总是更高级问题的特例,可以通过软件包SSBtools中的函数来解决这些问题:
clientFrame <- as.data.frame(as.matrix(b[, 1, drop = FALSE]))
# Two lines below are both same as fac2sparse(b[,1]) %*% b[,-1]
t(FormulaSums(clientFrame, ~client - 1)) %*% b[, -1]
t(Hierarchies2ModelMatrix(clientFrame, list(client = ""))) %*% b[, -1]
# Two lines below add overall totals
t(FormulaSums(clientFrame, ~client)) %*% b[, -1]
t(Hierarchies2ModelMatrix(clientFrame, list(client = "Total"))) %*% b[, -1]
答案 1 :(得分:-1)
您需要加载data.table
个包来执行此操作,但由于您说它是一个非常大的矩阵,因此最好有data.table
假设您的矩阵为b
,您可以执行以下操作:
library(data.table)
setDT(b)
b[,lapply(.SD, sum), by = "client"]
如果您只需要汇总一些列,请在包文档.SDcols
中查找?data.table
参数。