我现在的问题如下。我有一个有向 1-mode 边列表,代表在某一年参与联合项目的成对 Actor ,它可能看起来像:
projektleader projectpartner year
A B 2005
A C 2000
B A 2002
... ... ...
现在我只需要特定年份的一个子集。并非所有参与者都在同一年活跃,因此子集的维度不同。对于下面的网络分析,我需要一个加权和有向邻接矩阵,所以我使用 [网络包] 的选项来创建它。我首先将其加载为网络对象,然后将其转换为邻接矩阵。
grants_00 <- subset(grants, (year_grant=2000), select = c(projectpartner, projectleader))
nw_00 <- network(grants_08to11[,1:2], matrix="edgelist", directed=TRUE)
grants_00.adj <- as.matrix(nw_00, matrix.type = "adjacency")
生成的矩阵看起来有点像
A B C E ...
A 0 1 1 0
B 1 0 0 0
...
到目前为止一切顺利。我现在的问题是:对于我计划进行的进一步分析,我需要一个每年具有相同维度和顺序的邻接矩阵。这意味着来自初始数据集的所有参与者都必须是相应年份矩阵的行和列名称,但矩阵应该只包含这一年的观察到的对。我希望我的问题很清楚。我感谢任何类型的建设性解决方案。
我的 ATM 想法如下:我创建一个包含初始数据集和缩减数据集的矩阵。然后我将那里的所有矩阵值设置为零。然后我以某种方式将它与简化矩阵相匹配,并在正确的行和列中用正确的值填充它。不幸的是,我不知道这怎么可能。
有人知道如何解决这个问题吗?
最佳答案
不幸的是,你的问题不清楚,所以我会尽力回答。
如果我知道你想要:
****给定一个大小矩阵:找到它们匹配的位置?****
我重新生成你的数据
library(network)
N <- 20
grants <- data.frame(
projectleader = sample(x=LETTERS[1:20],size=N,replace = TRUE),
projectpartner = sample(x=LETTERS[1:20],size=N,replace = TRUE),
year_grant = sample(x=0:5 ,size=N,replace = TRUE) +2000
)
head(grants)
projectleader projectpartner year_grant
1 D K 2002
2 M M 2001
3 K L 2005
4 N Q 2002
5 G D 2003
6 I B 2004
创建小矩阵的函数
##
adjency <- function(year){
grants_00 <- subset(grants, (year_grant==year),
select = c(projectpartner, projectleader))
nw_00 <- network(grants_00, matrix="edgelist", directed=TRUE)
grants_00.adj <- as.matrix(nw_00, matrix.type = "adjacency")
as.data.frame(grants_00.adj)
}
使用 plyr 获取每年的列表
library(plyr)
years <- unique(grants$year_grant)
years <- years[order(years)]
bigMatrix <- llply(as.list(years),.fun=adjm)
创建完整矩阵 ( The answer )
# create an empty matrix with NAs
population <- union(grants$projectpartner,grants$projectleader)
population_size <- length(population)
full_matrix <- matrix(rep(NA, population_size*population_size),
nrow=population_size)
rownames(full_matrix) <- colnames(full_matrix) <- population
找到他们匹配的位置
frn <- as.matrix(bigMatrix[[1]])
tmp <- match(rownames(frn), rownames(full_matrix))
tmp2 <- match(colnames(frn), colnames(full_matrix))
# do a merge
full_matrix[tmp,tmp2] <- frn
head(bigMatrix[[1]])
D I J K O Q S
D 0 0 0 0 0 0 0
I 0 0 0 0 0 0 0
J 1 0 0 0 0 0 0
K 0 0 0 0 0 0 0
O 0 0 0 1 0 0 0
Q 0 1 0 0 0 0 0
完整矩阵
K M L Q D B E J C S O F G N I A H
K 0 NA NA 0 0 NA NA 0 NA 0 0 NA NA NA 0 NA NA
M NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
L NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
Q 0 NA NA 0 0 NA NA 0 NA 0 0 NA NA NA 1 NA NA
D 0 NA NA 0 0 NA NA 0 NA 0 0 NA NA NA 0 NA NA
B NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
E NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
J 0 NA NA 0 1 NA NA 0 NA 0 0 NA NA NA 0 NA NA
C NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
S 0 NA NA 1 0 NA NA 0 NA 0 0 NA NA NA 0 NA NA
O 1 NA NA 0 0 NA NA 0 NA 0 0 NA NA NA 0 NA NA
F NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
G NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
N NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
I 0 NA NA 0 0 NA NA 0 NA 0 0 NA NA NA 0 NA NA
A NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
H NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
关于R - 匹配不同长度矩阵的行和列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13651402/