带有条件加法的R Matrix过程

时间:2013-05-20 15:10:20

标签: r matrix

我必须预先处理一个大矩阵。为了使我的例子更容易理解,我将使用以下矩阵:

原始数据

enter image description here

col = people and row = skills

在R中我的矩阵是:

test <- matrix(c(18,12,15,0,13,0,14,0,12),ncol=3, nrow=3)

目标

在我的情况下,我需要逐行处理。所以有3个步骤。对于我必须的每一行:

  1. 如果ij = ij(因此所有对角线都等于零),请输入0
  2. 如果其中一个ij = 0
  3. ,则输入0
  4. 否则我必须添加ij + ij
  5. 我将展示更明确的3个步骤。

    第1步(第1行)

    数据是第1行

    enter image description here

    结果是:

    enter image description here

    第2步(第2行)

    数据是第2行

    enter image description here

    结果是:

    enter image description here

    第3步(第3行)

    数据是第3行

    enter image description here

    结果是:

    enter image description here

    创建最大矩阵

    然后最大匹配是:

    enter image description here

    所以我的最终矩阵应该是:

    enter image description here

    问题

    有人可以告诉我如何在R中成功实现这一目标吗? 当然,如果我的矩阵有更多的行和列,同样的过程应该有效...

    非常感谢:)

1 个答案:

答案 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