1

我想利用一apply组函数中的一个来进行一些计算。

首先,我有两个矩阵,mat1并且mat2

mat1

    a   b   c
1   NA  NA  NA
2   1   1   1
3   1   1   NA
4   NA  1   NA

mat2

       a    b    c
a    1.0   0.2  0.3
b   -0.7   1.0  0.8 
c   -0.1  -0.3  1.0   

mat2是使用与此处无关的函数计算mat1的,本质上我想应用一个加权函数,当数据较少(因此不太准确)时mat1对结果进行惩罚。mat2

因此,为了实现这一点,我想对于 中的某个坐标x,ymat2计算 的两列的成对完整性mat1

例如:mat2["a","b"]mat2["b","a"](应该相同)将成为原始值 *(和的完整行和mat1/a的总行b)。mat1ab

所以真正的问题是如何将一个函数应用于一个矩阵,该矩阵为每一列循环每一列(双循环)并将其存储在权重矩阵中以与另一个矩阵相乘?

我已经可以使用rollapplyfromzoo包比较两行,如下所示:

rowSums(rollapply(is.na(t(mat1)), 2, function(x) !any(x))) 

我得到:

[1] 2 1

如,比较 a 和 b,2 行是完整的,比较 b 和 c,1 行是完整的。那么如何比较 a 与 b、a 与 c 以及 b 与 c 的比较呢?

谢谢。

4

1 回答 1

2

我再次查看您的问题,您似乎想要一个X具有相同维度的矩阵mat2,其中X[i,j]由 中的完整案例数给出mat1[,c(i,j)]。然后mat2将乘以X

完整案例的数量由 给出sum(complete.cases(mat1[,c(i,j)]))。我想在outer需要矢量化函数的情况下使用它,因此通过Vectorize

outer(seq(nrow(mat2)), seq(ncol(mat2)),
       Vectorize(function(x,y) sum(complete.cases(mat1[,c(x,y)])))
)
##      [,1] [,2] [,3]
## [1,]    2    2    1
## [2,]    2    3    1
## [3,]    1    1    1

这是您想要的对称矩阵。

于 2014-01-13T01:23:24.317 回答