我必须预先处理一个大矩阵。为了使我的例子更容易理解,我将使用以下矩阵:
col = people and row = skills
在R中我的矩阵是:
test <- matrix(c(18,12,15,0,13,0,14,0,12),ncol=3, nrow=3)
在我的情况下,我需要逐行处理。所以有3个步骤。对于我必须的每一行:
我将展示更明确的3个步骤。
数据是第1行
结果是:
数据是第2行
结果是:
数据是第3行
结果是:
然后最大匹配是:
所以我的最终矩阵应该是:
有人可以告诉我如何在R中成功实现这一目标吗? 当然,如果我的矩阵有更多的行和列,同样的过程应该有效...
非常感谢:)
答案 0 :(得分:1)
这是我在R
中的实现。代码不会完全按照您指定的方式执行这些步骤。我专注于你的最终矩阵,并假设这是你感兴趣的主要结果。
test <- matrix(c(18,12,15,0,13,0,14,0,12),ncol=3, nrow=3)
rownames(test) <- paste("Skill", 1:dim(test)[1], sep="")
colnames(test) <- paste("People", 1:dim(test)[2], sep="")
test
# Pairwise combinations
comb.mat <- combn(1:dim(test)[2], 2)
pairwise.mat <- data.frame(matrix(t(comb.mat), ncol=2))
pairwise.mat$max.score <- 0
names(pairwise.mat) <- c("Person1", "Person2", "Max.Score")
for ( i in 1:dim(comb.mat)[2] ) { # Loop over the rows
first.person <- comb.mat[1,i]
second.person <- comb.mat[2,i]
temp.mat <- test[, c(first.person, second.person)]
temp.mat[temp.mat == 0] <- NA
temp.rowSums <- rowSums(temp.mat, na.rm=FALSE)
temp.rowSums[is.na(temp.rowSums)] <- 0
max.sum <- max(temp.rowSums)
previous.val <- pairwise.mat$Max.Score[pairwise.mat$Person1 == first.person & pairwise.mat$Person2 == second.person]
pairwise.mat$Max.Score[pairwise.mat$Person1 == first.person & pairwise.mat$Person2 == second.person] <- max.sum*(max.sum > previous.val)
}
pairwise.mat
Person1 Person2 Max.Score
1 1 2 25
2 1 3 32
3 2 3 0
person.mat <- matrix(NA, nrow=dim(test)[2], ncol=dim(test)[2])
rownames(person.mat) <- colnames(person.mat) <- paste("People", 1:dim(test)[2], sep="")
diag(person.mat) <- 0
person.mat[cbind(pairwise.mat[,1], pairwise.mat[,2])] <- pairwise.mat$Max.Score
person.mat[lower.tri(person.mat, diag=F)] <- t(person.mat)[lower.tri(person.mat, diag=F)]
person.mat
People1 People2 People3
People1 0 25 32
People2 25 0 0
People3 32 0 0