我有一个矩阵,它代表各种工作之间的流动性:
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
)