【问题标题】:Array/matrix comparison by row instead of column按行而不是列进行数组/矩阵比较
【发布时间】:2020-06-07 18:14:16
【问题描述】:

我需要将数组中的每个项目与矩阵中的每个元素进行比较。矩阵和数组可以是任意大小。我不能使用循环或if 语句——主要是apply()ifelse() 等函数。 NA 数据可以忽略。这是一个例子:

x <- c(1,0,1,0,1,1,1,1,0,1,0,1)
y <- c(1, NA, 1, NA)

y 数组需要按行与 x 进行比较 - 以便在 y 中的每个元素与 x 进行比较之后,y 继续与 x 进行比较作为新行。我想要的解决方案是:

[,1] [,2] [,3] [,4]
[1,] TRUE NA TRUE NA
[2,] TRUE NA TRUE NA
[3,] FALSE  NA FALSE  NA

这个函数比较逻辑等价:

answer <- function(x,y){
  z <- x == y
  print(z)
}

解决方案返回正确答案,但在一行中,下一行应在第二个 NA 之后开始。

[1]  TRUE    NA  TRUE    NA  TRUE    NA  TRUE    NA FALSE    NA FALSE    NA

当我尝试将该答案转换为列长度 (y) - 在这种情况下为 4 的矩阵时 - 输出不正确。

answer <- function(x,y){
  z <- x == y
  z2 <- matrix(z, ncol = length(y))
  print(z2)
}

返回是按列直接比较值:

[,1] [,2]  [,3]  [,4]
[1,] TRUE   NA  TRUE    NA
[2,]   NA TRUE    NA FALSE
[3,] TRUE   NA FALSE    NA

我可以使用什么来通过一行中的每一列而不是一列中的每一行进行比较?我可以使用apply(z, 1, some built-in function) 或嵌套的apply(apply()) 函数吗?困难在于确保生成的矩阵大小正确,答案正确,同时补偿任何大小的数组/矩阵比较。

【问题讨论】:

    标签: r matrix


    【解决方案1】:

    我们可以使长度相同并进行比较

    x == y[col(x)]
    #       [,1] [,2]  [,3] [,4]
    #[1,]  TRUE   NA  TRUE   NA
    #[2,] FALSE   NA  TRUE   NA
    #[3,]  TRUE   NA FALSE   NA
    

    如果按行比较

    x == y
    

    或者

    x== y[row(x)]
    

    sweep

    sweep(x, 2, y, FUN = `==`)
    #       [,1] [,2]  [,3] [,4]
    #[1,]  TRUE   NA  TRUE   NA
    #[2,] FALSE   NA  TRUE   NA
    #[3,]  TRUE   NA FALSE   NA
    

    数据

    x <- matrix(c(1,0,1,0,1,1,1,1,0,1,0,1), nrow=3, ncol=4)
    y <- c(1, NA, 1, NA)
    

    【讨论】:

    • @user12027316 'x' 的第一列第二个值为 0,而 'y' 没有任何 0。如果按行比较,x == y
    【解决方案2】:

    你可以的

    t(t(x) == y)
    #      [,1] [,2]  [,3] [,4]
    #[1,]  TRUE   NA  TRUE   NA
    #[2,] FALSE   NA  TRUE   NA
    #[3,]  TRUE   NA FALSE   NA
    

    x <- matrix(c(1,0,1,0,1,1,1,1,0,1,0,1), nrow=3, ncol=4)
    y <- c(1, NA, 1, NA)
    

    【讨论】:

      猜你喜欢
      • 2019-05-23
      • 2017-08-05
      • 2014-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多