R - сопоставление строк и столбцов матриц разной длины
Моя проблема на данный момент заключается в следующем. У меня есть направленный 1-mode edgelist, представляющий пары актеров, участвующих в совместных проектах в течение определенного года, который может выглядеть следующим образом:
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 заключается в следующем: я создаю матрицу исходного набора данных и сокращенного набора данных. Затем я установил все значения матрицы в ноль. Затем я как-то сопоставляю его с уменьшенной матрицей и заполняю его правильными значениями в правильных строках и столбцах. К сожалению, я понятия не имею, как это возможно.
Кто-нибудь знает, как решить эту проблему?
1 ответ
К сожалению, ваш вопрос неясен, поэтому я постараюсь ответить.
Если я понимаю, вы хотите:
**** Учитывая большую и маленькую матрицу: найдите места, где они соответствуют?****
Я регенерирую ваши данные
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