【问题标题】:Calcul of the mean from diagonals of a matrix + incrementation从矩阵的对角线计算平均值 + 增量
【发布时间】:2015-04-23 14:33:34
【问题描述】:

我有这种矩阵。

我真的很抱歉,但我没有可重复的例子。

表 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

我想创建另一个这样的: 从对角线重构列。

表 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 行/

非常感谢

【问题讨论】:

  • 我已经尝试转置矩阵。但它不起作用。我需要读取矩阵的对角线。

标签: r matrix diagonal


【解决方案1】:

这个怎么样?

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

因此,您需要“滑过”所有行,因此这些值始终与尾随 NA 一致。该函数通过截断每一行中的所有NAs 来实现这一点,然后在好的值之后添加尽可能多的 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

【讨论】:

    【解决方案2】:

    另一种选择是使用'm1'的rowcol创建一个数字索引('indx'),然后使用'indx'的split矩阵('m1'),转换'由stri_list2matrixstringi 列出'到'矩阵'。我们将输出作为字符串,可以转换为“数字”。

    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))
    

    【讨论】:

      猜你喜欢
      • 2017-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多