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

时间:2018-01-20 16:38:47

标签: r matrix aggregate sparse-matrix

我有一个非常大的稀疏矩阵,每天有超过3年不同单词的频率。矩阵只包含当天单词的频率,因此rownames实际上是单词,而colnames是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

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

1 个答案:

答案 0 :(得分:1)

假设你的martix被称为&#34; a&#34; 重命名列

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