R 按colnames作为日期聚合稀疏矩阵
我有一个非常大的稀疏矩阵,每天使用不同单词的频率超过3年。矩阵只包含该单词在该天的频率,因此行名实际上是该单词,列名是2014-01-01到2017-12-31的日期。我想把矩阵按月份累加,所以我的想法是从日期中减去日期,这样我每个月都会得到相同的colname,但我不知道如何正确地将它们相加。至于几周内的聚合,我不知道该怎么做。我看到在数据帧中聚合是相对容易的,但我不想转换我的矩阵,因为它非常大,比如2gb。我也读过plyr,但不知道如何真正利用它。我也知道Matrix.utils aggregate.Matrix,但我根本不理解关于分组运算符的文档。我希望这是有道理的 矩阵如下所示:R 按colnames作为日期聚合稀疏矩阵,r,matrix,aggregate,sparse-matrix,R,Matrix,Aggregate,Sparse Matrix,我有一个非常大的稀疏矩阵,每天使用不同单词的频率超过3年。矩阵只包含该单词在该天的频率,因此行名实际上是该单词,列名是2014-01-01到2017-12-31的日期。我想把矩阵按月份累加,所以我的想法是从日期中减去日期,这样我每个月都会得到相同的colname,但我不知道如何正确地将它们相加。至于几周内的聚合,我不知道该怎么做。我看到在数据帧中聚合是相对容易的,但我不想转换我的矩阵,因为它非常大,比如2gb。我也读过plyr,但不知道如何真正利用它。我也知道Matrix.utils aggre
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 ...
. . . . . .
. . . . . .
该矩阵被称为sparse.freq,正如@Georgery所指出的,我用下面的行重命名了colnames
colnames(sparse.freq) <- substr(colnames(sparse.freq), 1, 7)
有人知道为什么吗,因为它与上面的矩阵相同,只是有不同的命名列假设您的martix被称为 重命名列
# 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))
请写一个可复制的例子。非常感谢。那工作很有魅力。你知道如何为每个星期存档吗?关于我编辑这篇文章的几周。别忘了编辑你的帖子,它提供了一个可复制的例子;嗨,谢谢。我编辑了我的帖子,几周来一直在尝试你的建议,但我发现了一个错误,我也在帖子中写了。base::rowSumsx中出错,na.rm=na.rm,dims=dims,…'x'必须是至少具有二维sah的数组,好的。对不起,我不明白为什么。问题是你没有提供一个可复制的例子。如果你这样做,错误不断出现,我可以在我的电脑上运行代码,看看发生了什么。现在,我只能在别人的电脑上读到一些我没有的矩阵。
Error in base::rowSums(x, na.rm = na.rm, dims = dims, ...) : 'x' must be a array with at least two dimensions
# 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)
library(lubridate)
myDates <- c("20170103", "20160103")
myDates <- ymd(myDates)
myWeeks <- paste(year(myDates), week(myDates))