我想利用其中一个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
应用加权函数来惩罚{{1}的结果当数据较少时(因此不太准确)。
为了达到这个目的,我希望mat2
中的某个坐标x,y
计算两列mat2
的成对完整性。
例如:mat1
或mat2["a","b"]
(应该相同)将成为原始值*(mat2["b","a"]
mat1
和a
的完整行/ b
和mat1
的{{1}}总行数。
所以真正的问题是如何将一个函数应用于循环每列的每个列的矩阵(双循环)并将其存储在权重矩阵中以与另一个矩阵相乘?
我已经可以使用a
包中的b
来比较两行,如下所示:
rollapply
我明白了:
zoo
如同比较a和b,完成2行并比较b和c,完成1行。那么如何比较a到b,a到c和b到c?
感谢。
答案 0 :(得分: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
这是您想要的对称矩阵。