你可以使用outer
函数
library(asbio)
A <- c(0,1,1,1,1,1,0)
B <- c(0,0,1,0,1,0,1)
C <- c(1,0,0,1,1,0,0)
D <- c(1,1,0,0,0,1,1)
E <- c(1,0,0,1,1,0,1)
M <- rbind(A,B,C,D,E)
res <- outer(1:nrow(M),
1:nrow(M),
FUN=function(i,j){
# i and j are 2 vectors of same length containing
# the combinations of the row indexes.
# e.g. (i[1] = 1, j[1] = 1) (i[2] = 1, j[2] = 2)) etc...
sapply(1:length(i),
FUN=function(x) Kappa(M[i[x],],M[j[x],])$ttl_agreement )
})
row.names(res) <- c('A','B','C','D','E')
colnames(res) <- c('A','B','C','D','E')
#> res
A B C D E
# A 100.00000 42.85714 42.85714 28.57143 28.57143
# B 42.85714 100.00000 42.85714 28.57143 57.14286
# C 42.85714 42.85714 100.00000 28.57143 85.71429
# D 28.57143 28.57143 28.57143 100.00000 42.85714
# E 28.57143 57.14286 85.71429 42.85714 100.00000
编辑 :
如果您更喜欢 for 循环(我建议运行一些测试以查看哪种方法更快),您可以使用expand.grid
来生成组合,然后遍历它们以填充矩阵
M <- rbind(A,B,C,D,E)
res <- matrix(NA,nrow=5,ncol=5) # pre-allocate the matrix
combs <- expand.grid(1:nrow(M),1:nrow(M))
for(i in 1:nrow(combs)){
r <- combs[i,1]
c <- combs[i,2]
res[r,c] <- Kappa(M[r,],M[c,])$ttl_agreement
}
row.names(res) <- c('A','B','C','D','E')
colnames(res) <- c('A','B','C','D','E')