【发布时间】:2019-09-20 02:59:20
【问题描述】:
我有下面的矩阵:
mat<- matrix(c(1,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0,
2,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,
0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,
0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,1,0,0,1,0,1,1,0,0,1,0,1,
1,1,0,0,0,0,0,0,1,0,1,2,1,0,0,0), nrow=16, ncol=6)
dimnames(mat)<- list(c("a", "c", "f", "h", "i", "j", "l", "m", "p", "q", "s", "t", "u", "v","x", "z"),
c("1", "2", "3", "4", "5", "6"))
我需要使用移动窗口方法聚合列。首先,窗口大小为 2,因此窗口由 2 列组成。对该聚合进行行总和。窗口将移动一步并再次进行行总和。对于提供的示例数据框,要聚合的第一列是第 1&2 列,第二个窗口将组合第 2&3 列,然后是 3&4,然后是 4&5 和 5&6。
这些结果(每个聚合的行总和)被放入一个矩阵中。在这个矩阵中,行是保守的,列现在代表每个聚合的结果。
接下来,移动窗口的大小将增加到 3。这样 3 列数据被合并(求和)。同样,窗口移动 1 步。对于提供的示例数据框,要聚合的第一列是第 1-2-3 列,第二个窗口将合并第 2-3-4 列,然后是 3-4-5、4-5-6。结果被放入一个单独的矩阵中。
移动窗口的大小会不断增加,直到窗口是所有列的大小。在本例中,最大的窗口结合了所有 6 个图。
下面是给定上面mat 的示例矩阵的窗口大小2 和3 的结果矩阵。列是根据添加的列命名的。
#Window length =2
mat1<- matrix( c(3,0,0,0,1,0,1,0,0,0,0,0,0,0,2,0,
2,0,1,1,2,0,0,0,0,0,0,0,0,0,1,0,
0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,
0,1,0,0,1,1,0,1,0,1,1,0,0,1,0,1,
1,1,0,0,1,0,0,1,1,1,2,2,1,1,0,1), nrow=16)
dimnames(mat1)<- list(c("a", "c", "f", "h", "i", "j", "l", "m", "p", "q", "s", "t", "u", "v","x", "z"),
c("1_2", "2_3", "3_4", "4_5", "5_6"))
#Window length 3
mat8<- matrix( c(3,0,1,1,2,0,1,0,0,0,0,0,0,0,3,0,
2,1,1,1,2,1,0,0,0,0,0,0,0,0,1,0,
0,1,1,1,2,1,0,1,0,1,1,0,0,1,0,1,
1,2,0,0,1,1,0,1,1,1,2,2,1,1,0,1), nrow=16)
dimnames(mat8)<- list(c("a", "c", "f", "h", "i", "j", "l", "m", "p", "q", "s", "t", "u", "v","x", "z"),
c("1_2_3", "2_3_4", "3_4_5", "4_5_6"))
在我的示例中,我有 6 列,因此总共会有 5 个结果矩阵。如果我有 600 列数据,我认为循环是迭代大型数据集的最有效方法。
【问题讨论】: