Применение функции к каждой комбинации строк в матрице с использованием R | общих соединений

#r #matrix #combinations

Вопрос:

Я новичок в R и хочу рассчитать общие и уникальные соединения компонентов (CM) для моей матрицы.

Поэтому у меня есть матрица компонентов(CM) и рабочих станций(WS). Чтобы вычислить общее соединение, я хочу выяснить, какой компонент производится на какой рабочей станции(как показано в матрице) по сравнению с другими компонентами. Общие соединения = когда CM1 и CM2 создаются одной и той же рабочей станцией уникальное соединение = когда CM1 создается рабочей станцией, а CM2-нет.

 Example
     WS1 WS2 WS3 WS4 WS5 WS6 WS7 WS8 WS9 WS10
CM1    1   0   1   1   1   1   1   1   0    0
CM2    0   1   0   0   0   1   1   1   0    0
CM3    1   0   0   1   1   0   1   0   0    1
CM4    0   1   1   1   1   0   1   1   1    1
CM5    1   0   0   1   0   0   0   1   0    1
CM6    0   1   0   1   0   0   0   0   1    0
CM7    0   1   1   1   1   1   1   0   1    1
CM8    1   0   0   1   1   1   1   1   1    0
CM9    1   0   0   1   1   1   0   1   1    0
CM10   1   1   0   0   1   0   0   1   0    0
 

Мне нужна функция, которая сравнивает каждый элемент строки (например : CM1) с другой строкой(например : CM2). Например, если CM1[6] и CM2[6] >= 1, сумма должна быть сформирована. Например, общее соединение CM1_2 будет равно 3. Кроме того, мне это также нужно для необычных соединений, тогда как CM1[1] >0 и CM[2] == 0.

Для векторов это должно работать так:

 a = CM1 #as a vector
b = Cm2 #as a vector
common <- sum(aamp;b >=1)  #common connection
only_inCM1 <- sum(a >0 amp; b ==0) #unique connections
only_inCM2 <- sum(b >0 amp; a ==0)
 

Моя текущая проблема состоит в том, чтобы создать все комбинации распространенных и необычных соединений. Поэтому функция должна сравнивать СМ1 с СМ2, СМ1 с СМ3…до СМ10 с СМ9, вычисляя общее соединение и уникальные соединения, а затем для каждого сравнения (например. CM1_2) он должен применить функцию C[n] сверху.

C[n] = 100 * общее соединение/ общее соединение уникальное соединение

В конце концов, я хочу вычислить сумму C[n] для всех компонентов, разделенную на количество компонентов. Чтобы иметь общий индекс.


пример для CM1 и CM2

      WS1 WS2 WS3 WS4 WS5 WS6 WS7 WS8 WS9 WS10
CM1    1   0   1   1   1   1   1   1   0    0
CM2    0   1   0   0   0   1   1   1   0    0

common connection CM1_2 = 3
only in CM1 = 4
only in CM2 = 1
C[1,2] = 100 * 3 / 3 4 = 42,85  # Index for CM1 
C[2,1] = 100* 3 / 3 1  = 75  # Index for CM2

C = (C[1,2]   C[2,1]) / 2 = (42,85   75)/2 = 58,87

 

Я надеюсь, что у вас есть совет или подсказка, помогите мне, заранее большое спасибо 🙂

Комментарии:

1. команда, которая вам нужна, такова combn . взгляните на его страницу справки, используя ?combn

Ответ №1:

То же самое здесь, пишу r в первый раз, надеюсь, это поможет вам:

 colnames = c("WS1","WS2","WS3","WS4","WS5","WS6","WS7","WS8","WS9","WS10")
rownames  = c("C1", "C2")
   
A = matrix(
 c(1,0,1,1,1,1,1,1,0,0,0,1,0,0,0,1,1,1,0,0),
 nrow = 2,  
 ncol = 10,        
 byrow = TRUE,
 dimnames = list(rownames, colnames)        
)
#no of rows
r = nrow(A)
print(A)

#Common Connection
cc = matrix(0,r,r)

#Unique Connection
uc = matrix(0,r,r)

# Loop over matrix
for(row1 in 1:(r-1)) {
    for(row2 in (row1 1):r) {
        for(col in 1:ncol(A)) {
            if (A[row1, col]   A[row2,col] == 2) {
                cc[row1,row2] = 1   cc[row1,row2]
                cc[row2,row1] = 1   cc[row2,row1]
            } else if (A[row1, col] == 0 amp; A[row2,col] == 1) {
                uc[row2,row1] = 1   uc[row2,row1]
            } else if (A[row1, col] == 1 amp; A[row2,col] == 0) {
                uc[row1,row2] = 1   uc[row1,row2]
            }
        }
    }
}

#c[n] calculation
cn1 = matrix(0,r,r)
cn = 0

for(row in 1:r) {
    for(col in 1:r) {
        if (cc[row,col] > 0) 
            cn1[row,col] = 100 * cc[row,col] / (uc[row,col]   cc[row,col])
        cn = cn   cn1[row,col]
    }
}

cn = cn / r

print(cc)
print(uc)
print(cn1)

#Final results asked
print(cn)
 

Может быть, это не оптимально, но я надеюсь, что это сработает для вас.

Ответ №2:

Я нашел способ, который, как мне кажется, вполне подходит для моей проблемы.

 #cn = common connection
#un_CM1 = unique connection for Component 1
#un_CM2 = unique connection for Component 2

data <- matrix

alpha = do.call(rbind, combn(nrow(data), 2, function(x) 
  data.frame(CM_1 = x[1], CM_2 = x[2], 
             cn = sum(data[x[1],]amp;data[x[2],] >= 1), 
             un_CM1 = sum(data[x[1],] >0 amp; data[x[2],] ==0),
             un_CM2= sum(data[x[2],] >0 amp; data[x[1],] ==0)), 
  simplify = FALSE))

alpha <- alpha %>%rowwise() %>%
  mutate(PCN_CM1 = (100*cn)/(cn un_CM1),PCN_CM2 =(100*cn)/(cn un_CM2) )

PCN <- sum(alpha$PCN_CM1 alpha$PCN_CM2) / (2* nrow(alpha))