首页 文章

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

提问于
浏览
2

我现在的问题如下 . 我有一个定向的1模式边缘列表,代表参与某一年的联合项目的参与者对,可能看起来像:

projektleader   projectpartner  year
A               B               2005
A               C               2000
B               A               2002
...             ...             ...

现在我只需要一个特定年份的子集 . 并非所有参与者都在一年中活跃,因此子集的维度不同 . 对于以下网络分析,我需要一个加权和定向邻接矩阵,因此我使用[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")

得到的矩阵看起来有点像

A    B    C    E    ...
A    0    1    1    0
B    1    0    0    0
...

到现在为止还挺好 . 我现在的问题是:对于我计划进行的进一步分析,我需要每年具有相同维度和顺序的邻接矩阵 . 这意味着初始数据集中的所有参与者必须是相应年份的矩阵的行和列名称,但矩阵应仅包含此特定年份的观察对 . 我希望我的问题很明确 . 我很欣赏任何建设性的解决方案 .

我的想法ATM如下:我创建了一个初始数据集和简化数据集的矩阵 . 然后我将那里的所有矩阵值设置为零 . 然后我以某种方式将它与简化矩阵匹配,并在右侧行和列中填充正确的值 . 不幸的是,我不知道这可能是怎么回事 .

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

1 回答

  • 4

    不幸的是,你的问题不明确,所以我会尽力回答 .

    如果我理解你想要:

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

    我重新生成您的数据

    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)
    

    创建完整矩阵(答案)

    # 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
    

相关问题