Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在R中比较矩阵的两列与其他两列,并同时生成一个新矩阵?_R_Sapply - Fatal编程技术网

如何在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非常感谢!回答得很好!