通过单列聚合稀疏矩阵

时间:2017-09-19 16:38:27

标签: r

我有一个非常大的稀疏矩阵,看起来像:

 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()
)

2 个答案:

答案 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参数。