1

我有一个矩阵,它代表各种工作之间的流动性:

 jobdat <- matrix(c(
           295,  20,   0,    0,    0,    5,    7,
           45,   3309, 15,   0,    0,    0,    3,
           23,   221,  2029, 5,    0,    0,    0,
           0,    0,    10,   100,  8,    0,    3,
           0,    0,    0,    0,    109,  4,    4,
           0,    0,    0,    0,    4,    375,  38,
           0,    18,   0,    0,    4,    26,   260), 
           nrow = 7, ncol = 7, byrow = TRUE,
           dimnames = list(c("job 1","job 2","job 3","job 4","job 5","job 6","job 7"),
                c("job 1","job 2","job 3","job 4","job 5","job 6","job 7")))

这在社交网络分析中被视为有向加权邻接矩阵。网络的方向是从行到列:因此移动性被定义为从作业行到作业列。对角线是有意义的,因为可以换到另一家公司的同一份工作。

对于我的部分分析,我想选择一个由作业 1、作业 5 和作业 7 组成的子矩阵:

work.list <- c(1,5,7)
jobpick_wrong <- jobdat[work.list,work.list]

然而,这只给出了这三个工作之间的直接联系。我需要的是这个:

jobpick_right <- matrix(c(
          295,  20,   0,    5,    7,
          45,   3309, 0,    0,    3,
          0,    0,    109,  4,    4,
          0,    0,    4,    375,  38,
          0,    18,   4,    26,   260),
          nrow = 5, ncol = 5, byrow = TRUE,
          dimnames = list(c("job 1","job 2","job 5","job 6","job 7"),
                    c("job 1","job 2","job 5","job 6","job 7")))

这里还包括工作 2 和 6,因为这两个工作也与工作 1、5 或 7 有直接联系。而工作 3 和 4 被排除在外,因为它们与工作 1、5 或 7 没有任何联系。

我不知道该怎么做。也许我必须将其转换为 igraph 对象才能到达任何地方?

net           <- graph.adjacency(jobdat, mode = "directed", weighted = TRUE)

然后也许使用 ego/neighborhood-function,也来自 igraph 包?但是我真的不确定如何。或者,如果这是最好的方法。

感谢您的时间,

埃米尔·贝格鲁普-布莱特

增强问题:

aichao 的答案非常适合所提出的问题,尽管事实证明还需要另一个步骤。当创建了包含与三个“感兴趣的工作”相关的工作的 work.list 时,在此示例中为工作 1、5、7。然后,对于真实数据,杂乱的数量使另一个步骤变得可取:只保留与三个感兴趣的工作之间的直接联系,而其他工作之间的联系被设置为零。

上面的数据并没有很好地描述这一点,所以我创建了上面的一个非常版本来演示这一点:

jobdat <- matrix(c(
1,   0,   1,   0,   0,   0,   0,
1,   1,   1,   0,   0,   0,   0,
1,   1,   1,   0,   0,   0,   0,
0,   0,   0,   1,   0,   0,   0,
0,   0,   0,   0,   1,   0,   0,
0,   0,   0,   0,   0,   1,   0,
0,   0,   0,   0,   0,   0,   1
           ), 
           nrow = 7, ncol = 7, byrow = TRUE,
           dimnames = list(c("job 1","job 2","job 3","job 4","job 5","job 6","job 7"),
                c("job 1","job 2","job 3","job 4","job 5","job 6","job 7")))

通过使用aichaos解决方案:

work.list <- sort(unique(unlist(lapply(work.list, function(x) which(jobdat[x,] != 0)))))

然后我们得到这个:

jobdat[work.list,work.list]
#          job 1 job 2 job 3 job 5 job 7
#    job 1     1     0     1     0     0
#    job 2     1     1     1     0     0
#    job 3     1     1     1     0     0
#    job 5     0     0     0     1     0
#    job 7     0     0     0     0     1

然而,工作 2 和工作 3 之间的联系是无关紧要的,只是用来掩盖利益联系。

jobdat.result <- matrix(c(
1,     0,     1,     0,     0,
1,     1,     0,     0,     0,
1,     0,     1,     0,     0,
0,     0,     0,     1,     0,
0,     0,     0,     0,     1
           ), 
           nrow = 5, ncol = 5, byrow = TRUE,
           dimnames = list(c("job 1","job 2","job 3","job 5","job 7"),
                c("job 1","job 2","job 3","job 5","job 7")))

在 job.dat.result 中,作业 3 和作业 2 之间的关联已被删除,无论是按行还是按列,但保留这两个作业与三个感兴趣的作业之间的关联。理想情况下,应该可以选择作业 2 和作业 3 的对角线是否也应为零。但最有可能的是,对于所有工作,我会将对角线设置为零,因此这不是必需的。但是会很好,如果没有别的,那么让我在更高的层次上理解这个逻辑。

除其他外,我想要实现的是这样的圆图:

在此处输入图像描述

因此,关系数量的简单性很重要。该图是这样复制的:

library(circlize)
segmentcircle <- jobdat  
diag(segmentcircle) <- 0
df.c <- get.data.frame(graph.adjacency(segmentcircle,weighted=TRUE))
colour <-  brewer.pal(ncol(segmentcircle),"Set1")
chordDiagram(x = df.c, 
  grid.col = colour, 
  transparency = 0.2,
             directional = 1, symmetric=FALSE,
             direction.type = c("arrows", "diffHeight"), diffHeight  = -0.065,
             link.arr.type = "big.arrow", 
             # self.link=1
             link.sort = TRUE, link.largest.ontop = TRUE,
             link.border="black",
             # link.lwd = 2, 
             # link.lty = 2
             )
4

1 回答 1

2

假设您的有向图是从行到列的,您可以做的是增加work.list那些与work.list. 您可以通过以下方式做到这一点:

work.list <- sort(unique(unlist(lapply(work.list, function(x) which(jobdat[x,] != 0)))))

用于unique仅保留组合的唯一列,sort以便这些列按其索引排序。然后:

jobdat[work.list,work.list]
##      job 1 job 2 job 5 job 6 job 7
##job 1   295    20     0     5     7
##job 2    45  3309     0     0     3
##job 5     0     0   109     4     4
##job 6     0     0     4   375    38
##job 7     0    18     4    26   260

如果相反,您的有向图是从列到行:

work.list <- sort(unique(unlist(lapply(work.list, function(x) which(jobdat[,x] != 0)))))

更新了增强的问题:

随着新的jobdat

jobdat <- matrix(c(
  1,   0,   1,   0,   0,   0,   0,
  1,   1,   1,   0,   0,   0,   0,
  1,   1,   1,   0,   0,   0,   0,
  0,   0,   0,   1,   0,   0,   0,
  0,   0,   0,   0,   1,   0,   0,
  0,   0,   0,   0,   0,   1,   0,
  0,   0,   0,   0,   0,   0,   1
), 
nrow = 7, ncol = 7, byrow = TRUE,
dimnames = list(c("job 1","job 2","job 3","job 4","job 5","job 6","job 7"),
                c("job 1","job 2","job 3","job 4","job 5","job 6","job 7")))

以及相关工作列表work.list

work.list <- c(1,5,7)

Compute the augmented work list aug.work.list as the collection of jobs that goes directly to the relevant jobs in the work.list. This will include jobs 2 and 3. Note that we use which(jobdat[,x] != 0) instead of which(jobdat[x,] != 0) here to identify the job (either relevant or irrelevant) that connects to the relevant job x in the work.list.

aug.work.list <- sort(unique(unlist(lapply(work.list, function(x) which(jobdat[,x] != 0)))))
##[1] 1 2 3 5 7

This results in:

jobdat.result <- jobdat[aug.work.list, aug.work.list]
##      job 1 job 2 job 3 job 5 job 7
##job 1     1     0     1     0     0
##job 2     1     1     1     0     0
##job 3     1     1     1     0     0
##job 5     0     0     0     1     0
##job 7     0     0     0     0     1

Now, to remove the connections between irrelevant jobs, first find the indices for these irrelevant jobs in jobdat.result, which are indices of elements in aug.work.list that are not in work.list

irrelevant.job.indices <- which(!(aug.work.list %in% work.list))
##[1] 2 3

Note that these are not job numbers for the irrelevant jobs but the (row and column) indices in jobdat.result corresponding to the irrelevant job numbers. In this case, they just happen to correspond to the job numbers themselves.

jobdat.result移除连接需要为索引为irrelevant.job.indicesto的子矩阵设置非对角线0。去做这个:

## first, keep diagonal values for irrelevant.job.indices
dvals <- diag(jobdat.result)[irrelevant.job.indices]
## set sub-matrix to zero (this will also set diagnal elements to zero)
jobdat.result[irrelevant.job.indices,irrelevant.job.indices] <- 0
## replace diagonal elements
diag(jobdat.result)[irrelevant.job.indices] <- dvals

结果是:

jobdat.result
##      job 1 job 2 job 3 job 5 job 7
##job 1     1     0     1     0     0
##job 2     1     1     0     0     0
##job 3     1     0     1     0     0
##job 5     0     0     0     1     0
##job 7     0     0     0     0     1
于 2016-11-02T13:21:10.457 回答