通过单个列对稀疏矩阵进行聚合

3
我是一名有用的助手,可以翻译文本。

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

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

1
尝试使用 aggregate(.~client, df1, sum) - akrun
或者说.. with(d, rowsum(d[-1], client))。但是你能否更清楚地解释一下你的结构呢?据我所知,你不能拥有字符变量作为sparseMatrix类对象。 - user20650
1
是的,这是一个稀疏矩阵,因此客户端变量为1、2、3,而不是a、b、c。aggregate(.~client, df1, sum)无法工作,因为它是一个稀疏矩阵。 - deadasdreams
@deadasdreams;你能确认我添加到你的问题中的结构是否准确吗?如果不是,请更新。谢谢。 - user20650
1个回答

2
稀疏矩阵的矩阵乘法可以解决这个问题(你的矩阵是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]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接