【问题标题】:Applying a function to every combination of rows in a matrix using R | common connections使用 R 将函数应用于矩阵中的每个行组合公共连接
【发布时间】:2021-10-17 17:46:10
【问题描述】:

我是 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(a&b >=1)  #common connection
only_inCM1 <- sum(a >0 & b ==0) #unique connections
only_inCM2 <- sum(b >0 & a ==0)

我当前的问题是创建常见和不常见连接的所有组合。所以函数需要比较 CM1 和 CM2,CM1 和 CM3...直到 CM10 和 CM9,计算公共连接和唯一连接,然后对于每次比较(如 CM1_2),它应该在顶部应用函数 C[n] .

C[n] = 100 * common_connection/ common_connection + 唯一连接

最后,我想计算所有组件的 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

我希望你有一个建议或提示帮助我,非常感谢提前:)

【问题讨论】:

  • 您需要的命令是combn。使用?combn 查看它的帮助页面

标签: r matrix combinations


【解决方案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 & A[row2,col] == 1) {
                uc[row2,row1] = 1 + uc[row2,row1]
            } else if (A[row1, col] == 1 & 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],]&data[x[2],] >= 1), 
                 un_CM1 = sum(data[x[1],] >0 & data[x[2],] ==0),
                 un_CM2= sum(data[x[2],] >0 & 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))
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-10
      • 1970-01-01
      • 1970-01-01
      • 2017-04-02
      • 1970-01-01
      • 1970-01-01
      • 2020-04-10
      • 1970-01-01
      相关资源
      最近更新 更多