我想使用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
的结果。
因此,为了实现这一点,我想对mat2
中的某个坐标x,y
,计算mat1
的两列的成对完备性。
例如:mat2["a","b"]
或mat2["b","a"]
(应相同)将变为原始值*(a
和b
的mat1
的完整行/a
和b
的mat1
的总行)。
所以真正的问题是,我如何将函数应用于矩阵,该矩阵为每列循环每列(双循环),并将其存储在权重矩阵中,以与另一个矩阵相乘?
我已经可以使用zoo
包中的rollapply
比较两行,如下所示:
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进行比较呢?
谢谢。
我又看了一遍你的问题,似乎你想要一个与mat2
维度相同的矩阵X
,其中X[i,j]
由mat1[,c(i,j)]
中的完全事例数给出。则CCD_ 27将与CCD_ 28相乘。
完整案例的数量由CCD_ 29给出。我想在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
这是您想要的对称矩阵。