简体   繁体   中英

How to compare all possible combinations of objects in R by loop

Suppose I have binary vectors and need to compare their similarily with Kappa function.

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%

How to loop Kappa function to get table of all possible comparisons ?

I would like to get something like this:

    A   B   C   D   E
A 100  42   -   -   -
B  42 100   -   -   -
C   -   - 100   -   -
D   -   -   - 100   -
E   -   -   -   - 100

You can use outer function

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

EDIT :

if you prefer a for-loop (I'd suggest to run some tests to see which method is faster), you can use expand.grid to generate the combinations and then iterate over them to fill the matrix

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')

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM