我有一个数据集:
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()函数,但是仅当我想比较一个条件时,它才有用。
有人可以帮我吗?预先谢谢你。
答案 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行的条件。很容易确认确实如此。