1

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

原始数据

在此处输入图像描述

其中 col = 人员和 row = 技能

在 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 之一,则输入 0
  3. 否则我必须添加 ij+ij

我将展示 3 个步骤以更清楚地说明。

第 1 步(第 1 行)

数据是第1行

在此处输入图像描述

结果是:

在此处输入图像描述

第 2 步(第 2 行)

数据是第2行

在此处输入图像描述

结果是:

在此处输入图像描述

第 3 步(第 3 行)

数据是第3行

在此处输入图像描述

结果是:

在此处输入图像描述

创建一个最大矩阵

那么最大匹配是:

在此处输入图像描述

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

在此处输入图像描述

问题

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

非常感谢 :)

4

1 回答 1

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
于 2013-05-20T21:46:00.553 回答