У меня есть фрейм данных этой структуры:
df <- data.frame(var1 = c(1,1,1,2,2,3,3,3,3),
cat1 = c("A","B","D","B","C","D","E","B","A"))`
> df
var1 cat1
1 1 A
2 1 B
3 1 D
4 2 B
5 2 C
6 3 D
7 3 E
8 3 B
9 3 A
И я хочу создать из него кадры данных как узлов, так и краев, чтобы я мог нарисовать сетевой график, используя VisNetwork. Эта сеть покажет количество/силу соединений между различными значениями cat1, сгруппированными по значению var1.
У меня есть кадр данных узлов, отсортированный:
nodes <- data.frame(id = unique(df$cat1))
> nodes
id
1 A
2 B
3 D
4 C
5 E
Я хотел бы помочь с тем, как обрабатывать df следующим образом: для каждого отдельного значения var1 в df подсчитайте группу узлов, которые являются общими для этого значения var1, чтобы получить кадр данных ребер, который в конечном итоге выглядит как один ниже. Обратите внимание, что меня не беспокоит направление потока по краям. Все, что мне нужно, это то, что они подключены.
> edges
from to value
1 A B 2
2 A D 2
3 A E 1
4 B C 1
5 B D 2
6 B E 1
7 D E 1
С благодарностью в ожидании, Невил
Обновление: я нашел здесь аналогичную проблему и адаптировал этот код, чтобы дать, который приближается к тому, что я хочу, но не совсем там...
> df %>% group_by(var1) %>%
filter(n()>=2) %>% group_by(var1) %>%
do(data.frame(t(combn(.$cat1, 2,function(x) sort(x))),
stringsAsFactors=FALSE))
# A tibble: 10 x 3
# Groups: var1 [3]
var1 X1 X2
<dbl> <chr> <chr>
1 1. A B
2 1. A D
3 1. B D
4 2. B C
5 3. D E
6 3. B D
7 3. A D
8 3. B E
9 3. A E
10 3. A B