Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 按colnames作为日期聚合稀疏矩阵_R_Matrix_Aggregate_Sparse Matrix - Fatal编程技术网

R 按colnames作为日期聚合稀疏矩阵

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

我有一个非常大的稀疏矩阵,每天使用不同单词的频率超过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          ...
 .    .           .           .           .           .
 .    .           .           .           .           .
该矩阵被称为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))