首页 文章

矩阵运算:索引逻辑到数值比较的不对称向量

提问于
浏览
1

我正在使用逻辑矩阵来选择和排序数字矩阵中的相应元素的 indices (两者都具有相同的尺寸) . 例如,

x <- c(FALSE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE)
 y <- c(7, 10, 3, 1, 6, 8, 2, 11, 1, 5)

 order(y[x],decreasing=TRUE)
 [1] 5 1 4 3 2 6 

 # NOTE: these are the **indices** of the ordered vector y[x] now containing
 # only six elements (10,3,6,8,11,1)

大 . 按预期工作 . 但是,当我在矩阵上执行操作时,我获得了意想不到的结果:

x <- matrix(rep(c(F,T,T),10), nrow=10)

        [,1]  [,2]  [,3]
  [1,] FALSE  TRUE  TRUE
  [2,]  TRUE  TRUE FALSE
  [3,]  TRUE FALSE  TRUE
  [4,] FALSE  TRUE  TRUE
  [5,]  TRUE  TRUE FALSE
  [6,]  TRUE FALSE  TRUE
  [7,] FALSE  TRUE  TRUE
  [8,]  TRUE  TRUE FALSE
  [9,]  TRUE FALSE  TRUE
 [10,] FALSE  TRUE  TRUE

 y <- matrix( round(rnorm(30,sample(10))), ncol=3)

       [,1] [,2] [,3]
  [1,]    7    7    6
  [2,]   10   12    8
  [3,]    3    5    6
  [4,]    1    1    0
  [5,]    6    5    6
  [6,]    8    7    7
  [7,]    2    3    4
  [8,]   11    8    9
  [9,]    1    2    1
 [10,]    5    5    5

  y<-structure(c(7, 10, 3, 1, 6, 8, 2, 11, 1, 5, 7, 12, 5, 1, 5, 7, 
  3, 8, 2, 5, 6, 8, 6, 0, 6, 7, 4, 9, 1, 5), .Dim = c(10L, 3L))

 order(y[x], decreasing=TRUE)
 [1]  8  5  1  4 12  7 17  3 14 15 10 13 20 18  2 11  6  9 19 16

似乎当比较返回不等长度的向量(取决于x中的逻辑TRUE)时,我打破了操作的预期行为 . 然而,

y[x]
 [1] 10  3  6  8 11  1  7 12  1  5  3  8  5  6  6  0  7  4  1  5

产生我期望的没有订购;对所有TRUE元素执行order(y [x]) . 这是一个错误吗?我会(天真地)期望它会分别对每个列执行操作并连接上面的结果 .

在任何情况下,是否有合理的方法将非对称结果划分为矩阵?我考虑用NAs填充每个向量到最大dim(x)然后cbind到矩阵(见下文) . 看起来像一团糟,因为我会失去矢量化 . 还有更优雅的想法/提示吗?

谢谢 .

#Desired result
     [,1] [,2] [,3]
[1,]    5    2    4
[2,]    1    6    1
[3,]    4    1    2
[4,]    3    4    7
[5,]    2    7    5
[6,]    6    5    6
[7,]   NA    3    3

2 回答

  • 0

    y[x] 返回

    [1]  8  5  1  4 12  7 17  3 14 15 10 13 20 18  2 11  6  9 19 16
    

    这是一个数字向量 .

    order(y[x]) 因此正在处理数字向量 . 它没有内存 yx 是矩阵,没有能力读取你的想法,它应该按列方式应用到一个3列的矩阵,并且你想用 NA 值填充它 .

    您可以使用 is.na<- 并返回一个列表(类似于我写这篇文章时发布的答案)

    newy <- y
    
    is.na(newy) <- !x
    

    apply(newy,2,function(x)order(na.omit(x),decrease = TRUE))

    [[1]]
    [1] 5 1 4 3 2 6
    
    [[2]]
    [1] 2 6 1 4 7 5 3
    
    [[3]]
    [1] 4 1 2 7 5 6 3
    
  • 1

    我不确定你为什么要用NA保持矩阵结构 . 你不能使用列表清单吗?在这种情况下,您可以将矩阵转换为数据框并使用mapply . 这就是你在R中独立执行每个列的函数的方法 .

    my.order <- function(x, y) order(y[x],decreasing=TRUE)
    mapply(my.order, as.data.frame(x), as.data.frame(y))
    
    $V1
    [1] 5 1 4 3 2 6
    
    $V2
    [1] 2 6 1 4 7 5 3
    
    $V3
    [1] 4 1 2 7 5 6 3
    

    如果确实需要,您可以随时填充每个元素并将列表强制转换为数据框 .

相关问题