我有一个非常大的稀疏矩阵,每天有超过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
有人知道为什么,因为它与上面的矩阵相同,只是有不同的命名列
答案 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))