我如何在 R 中将矩阵的两列与其他两列进行比较并同时生成一个新矩阵?
How I can compare in R two columns of a matrix with two others and generate at the same time a new matrix?
我有一个数据集:
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() 函数,但它只有在我想比较一个条件时才有用。
有人可以帮助我吗?提前谢谢你。
您可以使用 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
此 table 中的第一个条目告诉我们,与原始矩阵的第 2 行相比,原始矩阵的第 3 行符合标准。很容易确认确实是这样。
我有一个数据集:
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() 函数,但它只有在我想比较一个条件时才有用。
有人可以帮助我吗?提前谢谢你。
您可以使用 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
此 table 中的第一个条目告诉我们,与原始矩阵的第 2 行相比,原始矩阵的第 3 行符合标准。很容易确认确实是这样。