如何在R的矩阵的两列中与其他两列进行比较,并同时生成一个新矩阵?

时间:2020-06-04 13:11:55

标签: r sapply

我有一个数据集:

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()函数,但是仅当我想比较一个条件时,它才有用。

有人可以帮我吗?预先谢谢你。

1 个答案:

答案 0 :(得分:2)

您可以使用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行的条件。很容易确认确实如此。