R-匹配不同长度的矩阵的行和列

Dan*_*ain 2 r matrix social-networking adjacency-matrix sna

我目前的问题是以下。我有一个有向的1模式边沿列表,代表在特定年份中参与联合项目的成对演员,可能看起来像:

projektleader   projectpartner  year
A               B               2005
A               C               2000
B               A               2002
...             ...             ...
Run Code Online (Sandbox Code Playgroud)

现在我只需要一个特定年份的子集。并非所有参与者都在这一年活跃,因此子集的规模有所不同。对于下面的网络分析,我需要一个加权有向的邻接矩阵,因此我使用[network package]的选项来创建它。我首先将其加载为网络对象,然后将其转换为邻接矩阵。

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")
Run Code Online (Sandbox Code Playgroud)

结果矩阵看起来像

     A    B    C    E    ...
A    0    1    1    0
B    1    0    0    0
...
Run Code Online (Sandbox Code Playgroud)

到目前为止,一切都很好。我的问题现在是:为了进行进一步的分析,我打算每年以相同的维度和顺序使用邻接矩阵。这意味着来自初始数据集的所有参与者必须是对应年份矩阵的行名和列名,但是矩阵只应包含该特定年份的观察对。我希望我的问题很清楚。我感谢任何建设性的解决方案。

我的想法是ATM:创建初始数据集和简化数据集的矩阵。然后,将所有矩阵值都设置为零。然后我以某种方式将其与简化后的矩阵匹配,并在正确的行和列中使用正确的值填充它。不幸的是,我不知道这怎么可能。

有谁知道如何解决这个问题?

ags*_*udy 5

不幸的是,您的问题尚不清楚,所以我将尽力回答。

如果我了解您的要求:

****给出大小矩阵:找到它们匹配的位置?****

我重新生成您的数据

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
Run Code Online (Sandbox Code Playgroud)

创建小矩阵的功能

## 
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)
}
Run Code Online (Sandbox Code Playgroud)

使用plyr获取每年的列表

library(plyr)
years <- unique(grants$year_grant)
years <- years[order(years)]
bigMatrix <- llply(as.list(years),.fun=adjm)
Run Code Online (Sandbox Code Playgroud)

创建完整矩阵(答案

# 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
Run Code Online (Sandbox Code Playgroud)

找到他们匹配的位置

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
Run Code Online (Sandbox Code Playgroud)

完整矩阵

    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
Run Code Online (Sandbox Code Playgroud)