如何在R中比较矩阵的两列与其他两列,并同时生成一个新矩阵?
我有一个数据集:如何在R中比较矩阵的两列与其他两列,并同时生成一个新矩阵?,r,sapply,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= d
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
此表中的第一项告诉我们,与原始矩阵的第2行相比,原始矩阵的第3行符合标准。很容易确认事实确实如此。可能是一个变体:
+(外部(m[,1],m[,1],“>”)&外部(m[,2],m[,2],“==”)&m[,2]!=0)
这是非常聪明的@GKi,-你在使用m[,2]
的自动循环,对吗?这些年来,我一直在使用R,我没有意识到可以用+
替换as.numeric()
来转换逻辑向量!这就是我如此爱你的原因!是的,使用了自动回收m[,2]
。@Allan Cameron非常感谢!回答得很好!