【问题标题】:How I can compare in R two columns of a matrix with two others and generate at the same time a new matrix?如何在 R 中将矩阵的两列与其他两列进行比较并同时生成一个新矩阵?
【发布时间】:2020-06-04 13:11:55
【问题描述】:

我有一个数据集:

time   delta
0.47   0
0.01   1
0.30   1
0.07   0
0.38   0
0.68   1
0.13   0
0.09   1
0.08   1
0.04   0
0.13   0
0.41   1
0.22   0
0.11   0
0.85   0
0.26   0

我正在使用 R,我需要将此矩阵与其自身进行比较。我想生成一个新的矩阵 16*16 的值:

1 time_i > time_j  &  delta_i= delta_j != 0;

0 otherwise.

where i, j = 1,..., 16.

我尝试使用 sapply() 函数,但它仅在我想比较一个条件时才有用。

有人可以帮我吗?提前谢谢你。

【问题讨论】:

    标签: r sapply


    【解决方案1】:

    您可以使用outer 将函数应用于两个向量中的每对元素,因此您可以为两个逻辑比较中的每一个执行一个outer,将它们与逻辑AND 组合,然后转换为数字。在这里,我假设您的矩阵称为m

    1*(outer(m[,1], m[,1], `>`) & outer(m[,2], m[,2], function(x, y) x == y & x != 0))
    

    这给出了以下输出:

    #>      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14]
    #> [1,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
    #> [2,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
    #> [3,]    0    1    0    0    0    0    0    1    1     0     0     0     0     0
    #> [4,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
    #> [5,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
    #> [6,]    0    1    1    0    0    0    0    1    1     0     0     1     0     0
    #> [7,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
    #> [8,]    0    1    0    0    0    0    0    0    1     0     0     0     0     0
    #> [9,]    0    1    0    0    0    0    0    0    0     0     0     0     0     0
    #>[10,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
    #>[11,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
    #>[12,]    0    1    1    0    0    0    0    1    1     0     0     0     0     0
    #>[13,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
    #>[14,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
    #>[15,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
    #>[16,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
    #>       [,15] [,16]
    #> [1,]     0     0
    #> [2,]     0     0
    #> [3,]     0     0
    #> [4,]     0     0
    #> [5,]     0     0
    #> [6,]     0     0
    #> [7,]     0     0
    #> [8,]     0     0
    #> [9,]     0     0
    #>[10,]     0     0
    #>[11,]     0     0
    #>[12,]     0     0
    #>[13,]     0     0
    #>[14,]     0     0
    #>[15,]     0     0
    #>[16,]     0     0
    

    您可以通过将要找到 1 的行和列组成一个矩阵来更轻松地检查矩阵的元素是否位于正确的位置:

    which(res == 1, arr.ind = TRUE)
    #>       row col
    #>  [1,]   3   2
    #>  [2,]   6   2
    #>  [3,]   8   2
    #>  [4,]   9   2
    #>  [5,]  12   2
    #>  [6,]   6   3
    #>  [7,]  12   3
    #>  [8,]   3   8
    #>  [9,]   6   8
    #> [10,]  12   8
    #> [11,]   3   9
    #> [12,]   6   9
    #> [13,]   8   9
    #> [14,]  12   9
    #> [15,]   6  12
    

    此表中的第一个条目告诉我们,与原始矩阵的第 2 行相比,原始矩阵的第 3 行符合标准。很容易确认确实如此。

    【讨论】:

    • 可能是一个变种:+(outer(m[,1], m[,1], ">") & outer(m[,2], m[,2], "==") & m[,2] != 0)
    • 这很聪明@GKi,-您正在使用m[,2]的自动回收,对吗?这些年来使用 R 并且我没有意识到您可以用 + 替换 as.numeric() 来转换逻辑向量!这就是为什么我喜欢 SO!
    • 是的,使用m[,2]的自动回收。
    • @Allan Cameron 非常感谢您!很好的答案!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-06
    • 2020-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多