Матрица смежности из исходного набора целевых данных - PullRequest
0 голосов
/ 25 августа 2018

У меня есть следующий набор данных

Var1   Var2   Count
A       B      3
A       C      4
A       D      10
A       L      6

Мне нужно создать матрицу смежности для последующего использования при создании диаграммы аккордов. Я ищу эффективный способ получить его.

    A   B   C  D  L
A   0   3   4  10 6
B   3   0   0  0  0
C   4   0   0  0  0
D   10  0   0  0  0
L   6   0   0  0  0

Я ищу следующую визуализацию

Chord Diagram

Ответы [ 2 ]

0 голосов
/ 25 августа 2018

Вот опция, использующая xtabs. Преобразуйте первые два столбца в factor с levels, указанным в том порядке, который мы хотим получить в выходных данных. Затем используйте xtabs, чтобы получить matrix вывод, транспонируйте вывод и добавьте к исходной матрице, чтобы получить ожидаемый вывод

dat[1:2] <- lapply(dat[1:2], factor, levels = c("A", "B", "C", "D", "L"))
out <- xtabs(Count ~ Var1 + Var2, dat)
out + t(out)
#    Var2
#Var1  A  B  C  D  L
#   A  0  3  4 10  6
#   B  3  0  0  0  0
#   C  4  0  0  0  0
#   D 10  0  0  0  0
#   L  6  0  0  0  0

данные

dat <- structure(list(Var1 = c("A", "A", "A", "A"), Var2 = c("B", "C", 
"D", "L"), Count = c(3L, 4L, 10L, 6L)), class = "data.frame", 
 row.names = c(NA, -4L))
0 голосов
/ 25 августа 2018

Предположим, вы говорите только о генерации симметричной матрицы:

dat <- read.table(header=TRUE, stringsAsFactors=FALSE, text='
Var1   Var2   Count
A       B      3
A       C      4
A       D      10
A       L      6')

vars <- sort(unique(unlist(dat[c("Var1","Var2")])))
m <- matrix(0, nr=length(vars), nc=length(vars), dimnames=list(vars,vars))
m[as.matrix(dat[c("Var1","Var2")])] <- m[as.matrix(dat[c("Var2","Var1")])] <- dat$Count
m
#    A B C  D L
# A  0 3 4 10 6
# B  3 0 0  0 0
# C  4 0 0  0 0
# D 10 0 0  0 0
# L  6 0 0  0 0
...