Как сравнить все возможные комбинации объектов в R по циклу
Предположим, у меня есть двоичные векторы, и мне нужно сравнить их с Kappa
функция.
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)
Kappa(A,B)$ttl_agreement # 42%
Как зациклить Kappa
функция, чтобы получить таблицу всех возможных сравнений?
Я хотел бы получить что-то вроде этого:
A B C D E
A 100 42 - - -
B 42 100 - - -
C - - 100 - -
D - - - 100 -
E - - - - 100
1 ответ
Решение
Ты можешь использовать 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')