通过 colnames 聚合稀疏矩阵作为日期

aggregating a sparse matrix by colnames as dates

我有一个非常大的稀疏矩阵,其中每天出现不同单词的频率超过 3 年。矩阵只包含当天单词的频率,因此行名实际上是单词,列名是从 2014-01-01 到 2017-12-31 的日期。我想按月汇总矩阵,所以我的想法是从日期中删除一天,所以我每个月都得到相同的 colname,但我不知道如何正确地总结它们。至于在几周内聚合,我不知道该怎么做。我看到在数据帧中聚合相对容易,但我不想转换我的矩阵,因为它真的很大,比如 2gb。我也读过 plyr 但不知道如何真正利用它。我也知道 Matrix.utils aggregate.Matrix,但我根本不了解有关分组运算符的文档。我希望这是有道理的。

矩阵看起来像这样:

      2014-01-01  2014-01-02  2014-01-03  2014-01-04  ...
 a    4           5           .           20          ...
 b    .           .           45          .           ...
 c    2           2           13          87          ...
 d    2           .           87          12          ...
 .    .           .           .           .           .
 .    .           .           .           .           .

矩阵是 calles sparse.freq 并且正如@Georgery 所指出的,我确实用下面的行

重命名了 colnames
colnames(sparse.freq) <- substr(colnames(sparse.freq), 1, 7)

这会从日期中删除天数,只留下年份和月份,然后我使用 sapply 遍历矩阵并对值求和。

sparse.freq.months <- sapply(
    unique(colnames(sparse.freq))
    , function(x, sparse.freq) rowSums(sparse.freq[,colnames(sparse.freq) == x])
    , sparse.freq = sparse.freq)

几个星期以来,我尝试使用

将原始矩阵中的列重命名为年和周
myDates <- colnames(sparse.freq)
myWeeks <- paste(year(myDates), week(myDates))
colnames(sparse.freq) <- myWeeks

但是当我现在尝试这样做时

sparse.freq.weeks <- sapply(
     unique(colnames(sparse.freq))
     , function(x, sparse.freq) rowSums(sparse.freq[,colnames(sparse.freq) == x])
     , sparse.freq = sparse.freq)

我收到错误:

Error in base::rowSums(x, na.rm = na.rm, dims = dims, ...) : 'x' must be a array with at least two dimensions

有人知道为什么吗,因为它与上面的矩阵相同,只是具有不同的命名列

假设您的矩阵名为 "a" 重命名列

# you want the first 7 characters in the date strings
colnames(a) <- substr(colnames(a), 1, 7)

你可以这样总结

a <- matrix(
    c(1:10, 11:20)
    , nrow = 5
    , dimnames = list(1:5, c(1,2,1,2))
)

a

sapply(
    unique(colnames(a))
    , function(x, a) rowSums(a[,colnames(a) == x])
    , a = a)

对于一般的日期,我推荐 lubridate 包。如果你想要星期,首先转换类似于这样的列名:

library(lubridate)

myDates <- c("20170103", "20160103")
myDates <- ymd(myDates)
myWeeks <- paste(year(myDates), week(myDates))