我是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 &[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,计算共同连接和唯一连接,然后为每个比较(如。cm12),它应该在顶部应用函数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
我希望你有一个建议或提示帮助我,提前感谢:)
第一次写同样的东西,希望对你有所帮助:
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)
可能不是最优的,但我希望对你有用。
我找到了一种方法,我认为它很好地解决了我的问题。
#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))