R 按特殊条件将第一个矩阵中的每一行与第二个矩阵中的所有行进行比较,并将结果保存在矩阵中

R 按特殊条件将第一个矩阵中的每一行与第二个矩阵中的所有行进行比较,并将结果保存在矩阵中,r,R,我有两个矩阵a和b,我试图比较矩阵b的每一行和矩阵a的所有行。标准是:如果(b!=0和a!=0)求b的和行,并将结果除以带条件的b的和行(如果b>0或a>0) 示例:结果矩阵的第一个元素 r(b,a)=(a2+a4+a5)/(a1+a2+a4+a5+a6)=15/27 步骤1将b的第一行与矩阵a的第一行进行比较 b的第一行(0,3,5,7,0,0,0) a(5,3,5,7,7,0,0)的第一行 在条件if下(b值不等于0,a值不等于0) 满足条件的b的和值。5+3+7 = 15 步骤2:将b的第

我有两个矩阵a和b,我试图比较矩阵b的每一行和矩阵a的所有行。标准是:如果(b!=0和a!=0)求b的和行,并将结果除以带条件的b的和行(如果b>0或a>0) 示例:结果矩阵的第一个元素 r(b,a)=(a2+a4+a5)/(a1+a2+a4+a5+a6)=15/27

步骤1将b的第一行与矩阵a的第一行进行比较
b的第一行(0,3,5,7,0,0,0)
a(5,3,5,7,7,0,0)的第一行
在条件if下(b值不等于0,a值不等于0)
满足条件的b的和值。5+3+7 = 15
步骤2:将b的第一行与矩阵a的第一行进行比较
b的第一行(0,3,5,7,0,0,0)
a(5,3,5,7,7,0,0)的第一行
在条件if下(b值大于0或a值大于0)
满足条件的b的和值。5+3+5+7+7 = 27
另一个例子是10/32
步骤1将b的第一行与矩阵a的第二行进行比较
b的第一行(0,3,5,7,0,0,0)
a(5,3,0,7,7,0,5)的第二行
在条件if下(b值不等于0,a值不等于0)
满足条件的b的和值。3+7 = 10  
步骤2:将b的第一行与矩阵a的第二行进行比较
b的第一行(0,3,5,7,0,0,0)
a(5,3,0,7,7,0,5)的第二行
在条件if下(b值大于0或a值大于0)
满足条件的b的和值。5+3+5+7+7+5 = 32

a要做到这一点,我们可以使用嵌套的
apply
将一个矩阵的行与另一个矩阵的行进行比较

fun=function(x,y) {y[y==0]=x[y==0];sum(y)}
 t(apply(a,1,function(x) apply(b,1,function(y) sum(y[x!=0 &y!=0])/fun(x,y) )))
           [,1]      [,2]      [,3]      [,4]      [,5]      [,6]      [,7]
 [1,] 0.5555556 0.8437500 0.2962963 0.2962963 0.3333333 0.5555556 0.4062500
 [2,] 0.3125000 0.8437500 0.0937500 0.2962963 0.1428571 0.3125000 0.4062500
 [3,] 0.3750000 0.9062500 0.1562500 0.1562500 0.3125000 0.3750000 0.4687500
 [4,] 0.5555556 0.8437500 0.2962963 0.0937500 0.1428571 0.5555556 0.4062500
 [5,] 0.4000000 0.6857143 0.1666667 0.1666667 0.4814815 0.4000000 0.2857143
 [6,] 0.2000000 0.6857143 0.0000000 0.1666667 0.2500000 0.2000000 0.2857143
 [7,] 0.4000000 0.6857143 0.1666667 0.0000000 0.2500000 0.4000000 0.2857143

你能为你的两个矩阵a和b的样子以及你想要的输出提供一个可复制的例子吗?
fun=function(x,y){y[y==0]=x[y==0];sum(y)}
t(apply(a,1,函数(x)apply(b,1,函数(y)sum(y[x!=0&y]))/fun(x,y))
既然你的问题被搁置,这个函数会给你预期的结果。非常感谢谢谢,这段代码真的很有用,但添加一些解释性的文字可能会有帮助,说明代码的关键部分在做什么,尤其是嵌套的
apply
函数。
apply
函数是一个for循环,我使用
MARGIN=1
表示我想逐行比较矩阵。所以我使用了一个
嵌套for循环
,隐藏在
嵌套apply
的引擎盖下。只需使用
apply
,您就会看到代码非常简单。如果这个解决方案对你合适,你可以接受它。非常感谢。
fun=function(x,y) {y[y==0]=x[y==0];sum(y)}
 t(apply(a,1,function(x) apply(b,1,function(y) sum(y[x!=0 &y!=0])/fun(x,y) )))
           [,1]      [,2]      [,3]      [,4]      [,5]      [,6]      [,7]
 [1,] 0.5555556 0.8437500 0.2962963 0.2962963 0.3333333 0.5555556 0.4062500
 [2,] 0.3125000 0.8437500 0.0937500 0.2962963 0.1428571 0.3125000 0.4062500
 [3,] 0.3750000 0.9062500 0.1562500 0.1562500 0.3125000 0.3750000 0.4687500
 [4,] 0.5555556 0.8437500 0.2962963 0.0937500 0.1428571 0.5555556 0.4062500
 [5,] 0.4000000 0.6857143 0.1666667 0.1666667 0.4814815 0.4000000 0.2857143
 [6,] 0.2000000 0.6857143 0.0000000 0.1666667 0.2500000 0.2000000 0.2857143
 [7,] 0.4000000 0.6857143 0.1666667 0.0000000 0.2500000 0.4000000 0.2857143