【问题标题】:Move positions in a table - R在表格中移动位置 - R
【发布时间】:2017-12-08 20:13:24
【问题描述】:

在 R 中,考虑到通用矩阵 A,如何将三角形 NA 移动到矩阵 B 中的位置?如果矩阵是 m x n 呢?

> A <- matrix(c(3, NA, NA, 4, 2, NA, 1, 5, 3), nrow = 3)
> A
     [,1] [,2] [,3]
[1,]    3    4    1
[2,]   NA    2    5
[3,]   NA   NA    3


> B <- matrix(c(3, 2, 3, 4, 5, NA, 1, NA, NA), nrow = 3)
> B
     [,1] [,2] [,3]
[1,]    3    4    1
[2,]    2    5   NA
[3,]    3   NA   NA

谢谢!

【问题讨论】:

  • 这种变换的数学解释是什么?

标签: r matrix


【解决方案1】:

我不知道是否有更惯用的方式,但这似乎可以满足您的要求:

A <- matrix(c(3, NA, NA, 4, 2, NA, 1, 5, 3), nrow = 3)
A

     [,1] [,2] [,3]
[1,]    3    4    1
[2,]   NA    2    5
[3,]   NA   NA    3

t(apply(A, 1, function(x) x[order(is.na(x))]))

     [,1] [,2] [,3]
[1,]    3    4    1
[2,]    2    5   NA
[3,]    3   NA   NA

A <- matrix(c(3, NA, NA, NA, 4, 2, NA, NA, 1, 5, 3, NA), nrow=4)
A

     [,1] [,2] [,3]
[1,]    3    4    1
[2,]   NA    2    5
[3,]   NA   NA    3
[4,]   NA   NA   NA


t(apply(A, 1, function(x) x[order(is.na(x))]))

     [,1] [,2] [,3]
[1,]    3    4    1
[2,]    2    5   NA
[3,]    3   NA   NA
[4,]   NA   NA   NA

A <- matrix(c(3, NA, NA, 4, 2, NA, 1, 5, 3, 6, 7, 8), nrow=3)
A

     [,1] [,2] [,3] [,4]
[1,]    3    4    1    6
[2,]   NA    2    5    7
[3,]   NA   NA    3    8

t(apply(A, 1, function(x) x[order(is.na(x))]))

     [,1] [,2] [,3] [,4]
[1,]    3    4    1    6
[2,]    2    5    7   NA
[3,]    3    8   NA   NA

【讨论】:

    【解决方案2】:

    一种可能的方法是在列上旋转 180。我假设 A 中的 NA 三角形用于在旋转后在矩阵 B 中设置 NA。可以使用相同的技术在 A 矩阵本身中进行旋转。

    A <- matrix(c(3, NA, NA, 4, 2, NA, 1, 5, 3), nrow = 3)
    A
         [,1] [,2] [,3]
    [1,]    3    4    1
    [2,]   NA    2    5
    [3,]   NA   NA    3
    
    B <- matrix(c(3, 2, 3, 4, 5, 4, 1, 6, 8), nrow = 3)
    B
         [,1] [,2] [,3]
    [1,]    3    4    1
    [2,]    2    5    6
    [3,]    3    4    8
    
    #Find NA in A
    NA_Val <- is.na(A)
    
    #Rotate NA matrix on column
    NA_VAL_180 <- NA_Val[1:nrow(NA_Val),ncol(NA_Val):1]
    
    #Set corresponding values NA in B. 
    B[NA_VAL_180] <- NA
    B
         [,1] [,2] [,3]
    [1,]    3    4    1
    [2,]    2    5   NA
    [3,]    3   NA   NA
    

    【讨论】:

    • 从广义上讲,您如何在第一步中产生 B?例如。如果A &lt;- matrix(sample(c(NA,rnorm(9, 5, 1)), 1000, replace = TRUE, prob = c(.3,rep(9/70, 9))), nrow = 10).
    • @JosephWood OP 使用了 2 个单独的矩阵,并表示打算通过旋转将 NA 三角形从 A 移动到 B。这表明他有办法在分析之前同时拥有 A 和 B。
    • 我认为 OP 要求从 A 生成矩阵 B,但不确定
    • @JosephWood 但示例为他提供了不同的建议。不是吗?
    • 正如我在之前的评论中所说,我不太确定,因为 OP 在这一点上不是很清楚。也许OP的一些澄清是有序的。不管你的方法很好。
    猜你喜欢
    • 1970-01-01
    • 2014-11-20
    • 2021-09-24
    • 2018-05-17
    • 1970-01-01
    • 2020-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多