从矩阵的对角线计算平均值 + 增量
Calcul of the mean from diagonals of a matrix + incrementation
我有这种矩阵
非常抱歉,我没有可重现的示例。
Table 1 :
[,1][,2][,3][,4][,5][,6][,7][,8][,9][,10]
[1,] 3 NA NA NA NA NA NA NA NA NA
[2,] 4 2 NA NA NA NA NA NA NA NA
[3,] 4 1 7 NA NA NA NA NA NA NA
[4,] 4 1 2 3 NA NA NA NA NA NA
[5,] 5 2 0 0 5 NA NA NA NA NA
[6,] 2 0 3 3 5 9 NA NA NA NA
[7,] 6 2 0 0 3 4 2 NA NA NA
[8,] 12 6 4 3 1 0 2 6 NA NA
[9,] 16 11 7 6 5 3 4 0 3 NA
[10,] 19 15 13 9 7 6 6 3 3 5
我想再创建一个这样的:
从对角线重建列。
Table 2:
[,1][,2][,3][,4][,5][,6][,7][,8][,9]
[1,] 3 4 4 5 2 6 12 16 19
[2,] 2 1 1 0 2 6 11 15 NA
[3,] 7 2 0 0 4 7 13 NA NA
[4,] 3 0 3 3 6 9 NA NA NA
[5,] 5 5 3 5 7 NA NA NA NA
[6,] 9 4 0 6 NA NA NA NA NA
[7,] 2 2 4 NA NA NA NA NA NA
[8,] 6 0 3 NA NA NA NA NA NA
[9,] 3 3 NA NA NA NA NA NA NA
[10,] 5 NA NA NA NA NA NA NA NA
Table 2[,1]= Table 1[1,1];[2,2];[3;3]
Table 2[,2]= Table 1 [2,1];[3,2];[4,3]
Table 2[,3]= Table 1 [3,1];[4,2];[5,3]
我试过这段代码,但没有成功。
Table2=matrix(NA, ncol=10, nrow=10)
for(i in 0:9)
{
Table2[i+1]=Table1[i+1,i+1]
}
下一步,将计算 colMean。
所有这些都是为了交叉验证来评估 sarima。
这只是一个例子,在真实的数据库中,我有超过 100 列和 100 行/
非常感谢
这个怎么样?
t(apply(t(yr_mat), 1, function(x) c(na.omit(x), rep(NA, sum(is.na(x))))))
矩阵的转置让你走到这一步:
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
V1 3 4 4 4 5 2 6 12 16 19
V2 NA 2 1 1 2 0 2 6 11 15
V3 NA NA 7 2 0 3 0 4 7 13
V4 NA NA NA 3 0 3 0 3 6 9
V5 NA NA NA NA 5 5 3 1 5 7
V6 NA NA NA NA NA 9 4 0 3 6
V7 NA NA NA NA NA NA 2 2 4 6
V8 NA NA NA NA NA NA NA 6 0 3
V9 NA NA NA NA NA NA NA NA 3 3
V10 NA NA NA NA NA NA NA NA NA 5
所以你需要的是 'slide over' 所有的行,所以这些值一直留有尾随的 NA。该函数通过截断每行中的所有 NA
,然后在合适的值后添加尽可能多的 NA 来实现。
最后,您必须再次转置所有内容,使其按照您想要的方式定向。
输出为:
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
V1 3 4 4 4 5 2 6 12 16 19
V2 2 1 1 2 0 2 6 11 15 NA
V3 7 2 0 3 0 4 7 13 NA NA
V4 3 0 3 0 3 6 9 NA NA NA
V5 5 5 3 1 5 7 NA NA NA NA
V6 9 4 0 3 6 NA NA NA NA NA
V7 2 2 4 6 NA NA NA NA NA NA
V8 6 0 3 NA NA NA NA NA NA NA
V9 3 3 NA NA NA NA NA NA NA NA
V10 5 NA NA NA NA NA NA NA NA NA
另一种选择是使用 'm1' 的 row
和 col
创建数字索引 ('indx'),然后 split
矩阵 ( 'm1') 通过 'indx',通过 stri_list2matrix
从 stringi
将 'list' 转换为 'matrix'。我们将输出作为字符串,可以转换为 'numeric'。
library(stringi)
indx <- (row(m1)-col(m1)+1L)*(NA^upper.tri(m1))
matrix(as.numeric(stri_list2matrix(split(m1, indx))), dim(m1))
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
# [1,] 3 4 4 4 5 2 6 12 16 19
# [2,] 2 1 1 2 0 2 6 11 15 NA
# [3,] 7 2 0 3 0 4 7 13 NA NA
# [4,] 3 0 3 0 3 6 9 NA NA NA
# [5,] 5 5 3 1 5 7 NA NA NA NA
# [6,] 9 4 0 3 6 NA NA NA NA NA
# [7,] 2 2 4 6 NA NA NA NA NA NA
# [8,] 6 0 3 NA NA NA NA NA NA NA
# [9,] 3 3 NA NA NA NA NA NA NA NA
#[10,] 5 NA NA NA NA NA NA NA NA NA
数据
m1 <- structure(c(3L, 4L, 4L, 4L, 5L, 2L, 6L, 12L, 16L, 19L, NA, 2L,
1L, 1L, 2L, 0L, 2L, 6L, 11L, 15L, NA, NA, 7L, 2L, 0L, 3L, 0L,
4L, 7L, 13L, NA, NA, NA, 3L, 0L, 3L, 0L, 3L, 6L, 9L, NA, NA,
NA, NA, 5L, 5L, 3L, 1L, 5L, 7L, NA, NA, NA, NA, NA, 9L, 4L, 0L,
3L, 6L, NA, NA, NA, NA, NA, NA, 2L, 2L, 4L, 6L, NA, NA, NA, NA,
NA, NA, NA, 6L, 0L, 3L, NA, NA, NA, NA, NA, NA, NA, NA, 3L, 3L,
NA, NA, NA, NA, NA, NA, NA, NA, NA, 5L), .Dim = c(10L, 10L),
.Dimnames = list(NULL, NULL))
我有这种矩阵
非常抱歉,我没有可重现的示例。
Table 1 :
[,1][,2][,3][,4][,5][,6][,7][,8][,9][,10]
[1,] 3 NA NA NA NA NA NA NA NA NA
[2,] 4 2 NA NA NA NA NA NA NA NA
[3,] 4 1 7 NA NA NA NA NA NA NA
[4,] 4 1 2 3 NA NA NA NA NA NA
[5,] 5 2 0 0 5 NA NA NA NA NA
[6,] 2 0 3 3 5 9 NA NA NA NA
[7,] 6 2 0 0 3 4 2 NA NA NA
[8,] 12 6 4 3 1 0 2 6 NA NA
[9,] 16 11 7 6 5 3 4 0 3 NA
[10,] 19 15 13 9 7 6 6 3 3 5
我想再创建一个这样的: 从对角线重建列。
Table 2:
[,1][,2][,3][,4][,5][,6][,7][,8][,9]
[1,] 3 4 4 5 2 6 12 16 19
[2,] 2 1 1 0 2 6 11 15 NA
[3,] 7 2 0 0 4 7 13 NA NA
[4,] 3 0 3 3 6 9 NA NA NA
[5,] 5 5 3 5 7 NA NA NA NA
[6,] 9 4 0 6 NA NA NA NA NA
[7,] 2 2 4 NA NA NA NA NA NA
[8,] 6 0 3 NA NA NA NA NA NA
[9,] 3 3 NA NA NA NA NA NA NA
[10,] 5 NA NA NA NA NA NA NA NA
Table 2[,1]= Table 1[1,1];[2,2];[3;3]
Table 2[,2]= Table 1 [2,1];[3,2];[4,3]
Table 2[,3]= Table 1 [3,1];[4,2];[5,3]
我试过这段代码,但没有成功。
Table2=matrix(NA, ncol=10, nrow=10)
for(i in 0:9)
{
Table2[i+1]=Table1[i+1,i+1]
}
下一步,将计算 colMean。 所有这些都是为了交叉验证来评估 sarima。 这只是一个例子,在真实的数据库中,我有超过 100 列和 100 行/
非常感谢
这个怎么样?
t(apply(t(yr_mat), 1, function(x) c(na.omit(x), rep(NA, sum(is.na(x))))))
矩阵的转置让你走到这一步:
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
V1 3 4 4 4 5 2 6 12 16 19
V2 NA 2 1 1 2 0 2 6 11 15
V3 NA NA 7 2 0 3 0 4 7 13
V4 NA NA NA 3 0 3 0 3 6 9
V5 NA NA NA NA 5 5 3 1 5 7
V6 NA NA NA NA NA 9 4 0 3 6
V7 NA NA NA NA NA NA 2 2 4 6
V8 NA NA NA NA NA NA NA 6 0 3
V9 NA NA NA NA NA NA NA NA 3 3
V10 NA NA NA NA NA NA NA NA NA 5
所以你需要的是 'slide over' 所有的行,所以这些值一直留有尾随的 NA。该函数通过截断每行中的所有 NA
,然后在合适的值后添加尽可能多的 NA 来实现。
最后,您必须再次转置所有内容,使其按照您想要的方式定向。
输出为:
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
V1 3 4 4 4 5 2 6 12 16 19
V2 2 1 1 2 0 2 6 11 15 NA
V3 7 2 0 3 0 4 7 13 NA NA
V4 3 0 3 0 3 6 9 NA NA NA
V5 5 5 3 1 5 7 NA NA NA NA
V6 9 4 0 3 6 NA NA NA NA NA
V7 2 2 4 6 NA NA NA NA NA NA
V8 6 0 3 NA NA NA NA NA NA NA
V9 3 3 NA NA NA NA NA NA NA NA
V10 5 NA NA NA NA NA NA NA NA NA
另一种选择是使用 'm1' 的 row
和 col
创建数字索引 ('indx'),然后 split
矩阵 ( 'm1') 通过 'indx',通过 stri_list2matrix
从 stringi
将 'list' 转换为 'matrix'。我们将输出作为字符串,可以转换为 'numeric'。
library(stringi)
indx <- (row(m1)-col(m1)+1L)*(NA^upper.tri(m1))
matrix(as.numeric(stri_list2matrix(split(m1, indx))), dim(m1))
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
# [1,] 3 4 4 4 5 2 6 12 16 19
# [2,] 2 1 1 2 0 2 6 11 15 NA
# [3,] 7 2 0 3 0 4 7 13 NA NA
# [4,] 3 0 3 0 3 6 9 NA NA NA
# [5,] 5 5 3 1 5 7 NA NA NA NA
# [6,] 9 4 0 3 6 NA NA NA NA NA
# [7,] 2 2 4 6 NA NA NA NA NA NA
# [8,] 6 0 3 NA NA NA NA NA NA NA
# [9,] 3 3 NA NA NA NA NA NA NA NA
#[10,] 5 NA NA NA NA NA NA NA NA NA
数据
m1 <- structure(c(3L, 4L, 4L, 4L, 5L, 2L, 6L, 12L, 16L, 19L, NA, 2L,
1L, 1L, 2L, 0L, 2L, 6L, 11L, 15L, NA, NA, 7L, 2L, 0L, 3L, 0L,
4L, 7L, 13L, NA, NA, NA, 3L, 0L, 3L, 0L, 3L, 6L, 9L, NA, NA,
NA, NA, 5L, 5L, 3L, 1L, 5L, 7L, NA, NA, NA, NA, NA, 9L, 4L, 0L,
3L, 6L, NA, NA, NA, NA, NA, NA, 2L, 2L, 4L, 6L, NA, NA, NA, NA,
NA, NA, NA, 6L, 0L, 3L, NA, NA, NA, NA, NA, NA, NA, NA, 3L, 3L,
NA, NA, NA, NA, NA, NA, NA, NA, NA, 5L), .Dim = c(10L, 10L),
.Dimnames = list(NULL, NULL))