代码之家  ›  专栏  ›  技术社区  ›  JerBear

在R中使用数据集和向量之间的比较运算符:我做错了什么?

  •  2
  • JerBear  · 技术社区  · 1 年前

    我想在向量和数据帧之间使用比较运算符。比如说,我有一个向量 vector_test 在R中定义为

    vector_test = c(1, 2, 3)
    

    以及相应的数据帧 A_test 定义为

    A_test = data.frame(
                   x1 = c(1, 2, 3, 4, 5),
                   x2 = c(2, 3, 4, 5, 6),
                   x3 = c(3, 4, 5, 6, 7)
    )
    

    我想使用 矢量测试 用于隔离 A_测试 大于/等于中的元素 矢量测试 。我希望输出类似

    A_test >= vector_test
    
    > TRUE  TRUE        .
      TRUE. TRUE.       .
      TRUE. TRUE.       .
      TRUE.  ...        .
      TRUE.  ...        TRUE
    
    
    

    但我得到了

    enter image description here

    我知道,这听起来很愚蠢,但我不明白(a)我做错了什么,(b)R在做什么比较。

    3 回复  |  直到 1 年前
        1
  •  3
  •   jay.sf    1 年前

    你需要 t 先转换矩阵,进行比较,然后再转换回来。

    > t(t(A_test) >= vector_test)
           x1   x2   x3
    [1,] TRUE TRUE TRUE
    [2,] TRUE TRUE TRUE
    [3,] TRUE TRUE TRUE
    [4,] TRUE TRUE TRUE
    [5,] TRUE TRUE TRUE
    

    这样你就可以适当地利用回收利用。

    它类似于其他算术运算,如加法、乘法等。让我们演示在相同维度的零矩阵上的加法,如a_test。

    > (M <- array(0, dim=dim(A_test)))
         [,1] [,2] [,3]
    [1,]    0    0    0
    [2,]    0    0    0
    [3,]    0    0    0
    [4,]    0    0    0
    [5,]    0    0    0
    

    您所做的类似于:

    > M + vector_test
         [,1] [,2] [,3]
    [1,]    1    3    2
    [2,]    2    1    3
    [3,]    3    2    1
    [4,]    1    3    2
    [5,]    2    1    3
    

    您想要的是:

    > t(t(M) + vector_test)
         [,1] [,2] [,3]
    [1,]    1    2    3
    [2,]    1    2    3
    [3,]    1    2    3
    [4,]    1    2    3
    [5,]    1    2    3
    

    数据:

    > dput(vector_test)
    c(1, 2, 3)
    > dput(A_test)
    structure(list(x1 = c(1, 2, 3, 4, 5), x2 = c(2, 3, 4, 5, 6), 
        x3 = c(3, 4, 5, 6, 7)), class = "data.frame", row.names = c(NA, 
    -5L))
    
        2
  •  2
  •   user2554330    1 年前

    似乎正在发生的是,数据帧被强制为矩阵,然后被强制为向量进行比较,结果被转换回矩阵。

    的矢量版本 A_test

    c(1, 2, 3, 4, 5, 
      2, 3, 4, 5, 6,
      3, 4, 5, 6, 7)
    

    当您将其与长度为3的向量进行比较时,该向量首先被循环到长度为15,给出如下:

    c(1, 2, 3, 1, 2,
      3, 1, 2, 3, 1,
      2, 3, 1, 2, 3)
    

    然后将元素与来自数据帧的向量进行比较。中唯一的FALSE A_test >= vector_test 出现在第6个条目中。当转换回矩阵时,如您所见,这是第二列中的第一个条目。

        3
  •  2
  •   Allan Cameron    1 年前

    我认为您正在寻找数据帧与向量的逐行比较。也许你想要

    t(apply(A_test, 1, `>=`, vector_test))
    #>        x1   x2   x3
    #> [1,] TRUE TRUE TRUE
    #> [2,] TRUE TRUE TRUE
    #> [3,] TRUE TRUE TRUE
    #> [4,] TRUE TRUE TRUE
    #> [5,] TRUE TRUE TRUE
    

    R所做的是自动回收长度为3的向量5次,然后将其与数据帧中堆叠为一个大向量的三列进行比较。如果我们明确地这样做,我们将看到我们得到与您的初始结果相同的结果:

    vector_test_long <- rep(vector_test, 4)
    
    vector_test_long
    #>  [1] 1 2 3 1 2 3 1 2 3 1 2 3
    
    A_test >= vector_test_long
    #>        x1    x2   x3
    #> [1,] TRUE FALSE TRUE
    #> [2,] TRUE  TRUE TRUE
    #> [3,] TRUE  TRUE TRUE
    #> [4,] TRUE  TRUE TRUE
    #> [5,] TRUE  TRUE TRUE