2012-11-30 42 views
2

我现在的问题是以下。我有一个代表对参与联合项目在某一年的演员的导演1模式EdgeList,这些类可能看起来像:R - 匹配不同长度的矩阵行和列

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如下:我创建了初始数据集和简化数据集的矩阵。然后我将所有矩阵值设置为零。然后我以某种方式将它与缩小的矩阵相匹配,并在正确的行和列中填充正确的值。不幸的是我不知道这可能如何。

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

+0

没有你的数据很难帮助您!你可以输入(grants_00)并修改你的问题! – agstudy

回答

3

不幸的是,你的问题并不清楚,所以我会尽力回答。

如果我知道你想:

****给定一个大的和小的矩阵:找到他们匹配的位置****

我重新生成数据

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 
+0

非常感谢!我明天会试试看,但听起来正是我需要的。如果,那么它已经是一个伟大的帮助:) –

+0

你可以upvote,如果你很高兴:) – agstudy