Создать матрицу смежности из несбалансированных данных торгового потока в R - PullRequest
0 голосов
/ 13 января 2020

У меня есть набор данных о двусторонних торговых потоках размером 84x244.

Как мне сбалансировать набор данных, чтобы он выглядел как матрица 244x244, но сохраняя тот же порядок и имена, что и столбцы? Несимметричная c матрица

For example the matrix resembles: 
  A B C D
B 0 0 0 1
D 2 0 0 0

and it should look like 

  A B C D
A 0 0 0 0
B 0 0 0 1
C 0 0 0 0
D 2 0 0 0

With A B C D as row and column names 

Ответы [ 2 ]

0 голосов
/ 13 января 2020

Вот базовое решение R. Основная идея c заключается в том, что сначала вы строите квадратную матрицу, все нули и назначаете имена строк с именами столбцов, а затем присваиваете значения строкам в соответствии с именами строк, т. Е.

M <- `dimnames<-`(matrix(0,nrow = ncol(m),ncol = ncol(m)),
                  replicate(2,list(colnames(m))))
M[rownames(m),] <- m

такой что

> M
  A B C D
A 0 0 0 0
B 0 0 0 1
C 0 0 0 0
D 2 0 0 0
0 голосов
/ 13 января 2020

Вот два метода, которые гарантируют, что имена столбцов и имена строк фактически совпадают, используя значение по умолчанию 0 для отсутствующих строк / столбцов. Они не предполагают, что столбцы всегда заполнены; если это гарантировано, то вы можете игнорировать части, добавляющие столбцы.

Обе начинаются с:

m <- as.matrix(read.table(header=TRUE, text="
  A B C D
B 0 0 0 1
D 2 0 0 0"))

Первая

needrows <- setdiff(colnames(m), rownames(m))
m <- rbind(m, matrix(0, nrow=length(needrows), ncol=ncol(m), dimnames=list(needrows, colnames(m))))
needcols <- setdiff(rownames(m), colnames(m))
m <- cbind(m, matrix(0, nrow=nrow(m), ncol=length(needcols), dimnames=list(rownames(m), needcols)))
m
#   A B C D
# B 0 0 0 1
# D 2 0 0 0
# A 0 0 0 0
# C 0 0 0 0

И упорядочить строки одинаково в качестве столбцов ... обратите внимание, что если в именах столбцов отсутствуют имена строк, они будут удалены при этом, хотя при необходимости их можно включить с другим setdiff.

m[colnames(m),]
#   A B C D
# A 0 0 0 0
# B 0 0 0 1
# C 0 0 0 0
# D 2 0 0 0

Второй

allnames <- sort(unique(unlist(dimnames(m))))
m2 <- matrix(0, nrow=length(allnames), ncol=length(allnames),
             dimnames=list(allnames, allnames))
m2[intersect(rownames(m), allnames), colnames(m)] <- 
  m[intersect(rownames(m), allnames), colnames(m)]
m2[rownames(m), intersect(colnames(m), allnames)] <- 
  m[rownames(m), intersect(colnames(m), allnames)]
m2
#   A B C D
# A 0 0 0 0
# B 0 0 0 1
# C 0 0 0 0
# D 2 0 0 0
...