У меня возникли проблемы с определением того, как построить график для данных, для которых существует несколько возможностей успеха (1) или неудачи (0). Вы можете сгенерировать мой образец с помощью следующего кода:
# example
library(networkD3)
library(tidyverse)
library(tidyr)
set.seed(900)
n=1000
example.data<-data.frame("A" = rep(1,n),
"B" = sample(c(0,1),n,replace = T),
"C" = rep(NA,n),
"D" = rep(NA,n),
"E" = rep(NA,n),
"F" = rep(NA,n),
"G" = rep(NA,n))
for (i in 1:n){
example.data$C[i]<- ifelse(example.data$B[i]==1,
sample(c(0,1),1,prob = c(0.3,0.7),replace = F),
sample(c(0,1),1,prob = c(0.55,0.45),replace = F))
example.data$D[i]<-ifelse(example.data$C[i]==1,
sample(c(0,1),1,prob = c(0.95,0.05),replace = F),
sample(c(0,1),1,prob = c(0.65,0.35),replace = F))
example.data$E[i]<-ifelse(example.data$C[i]==0 & example.data$D[i]==0,
sample(c(0,1),1,prob = c(.9,.1),replace = F),
ifelse(example.data$C[i]==0 & example.data$D[i]==1,
sample(c(0,1),1,prob = c(.3,.7),replace = F),
ifelse(example.data$C[i]==1 & example.data$D[i]==0,
sample(c(0,1),1,prob = c(.9,.1),replace = F),
sample(c(0,1),1,prob = c(.1,.9),replace = F))))
example.data$F[i]<-ifelse(example.data$E==1,
sample(c(1,0),1,prob=c(.85,.15),replace = F),
sample(c(1,0),1,prob = c(.01,.99),replace = F))
example.data$G[i]<-sample(c(1,0),1,prob = c(.78,.22),replace = F)
}
example.data.1<-example.data%>%
gather()%>%
mutate(ORDER = c(rep(0,n),rep(1,n),rep(2,n),rep(3,n),rep(4,n),rep(5,n),rep(6,n)))%>%
dplyr::select("Event" = key,
"Success" = value,
ORDER)%>%
group_by(ORDER)%>%
summarise("YES" = sum(Success==1),
"NO" = sum(Success==0))
Сложность для меня заключается в том, как я могу сгенерировать данные ссылок без необходимости вручную указывать исходные цели и значения.
Я использовал пример sankey с этого веб-сайта и приступил к работе с данными моего собственного примера в наименее элегантных возможный способ:
links<-data.frame("source" = sort(rep(seq(0,10,1),2)),
"target" = c(1,2,3,4,3,4,5,6,5,6,7,8,7,8,9,10,9,10,11,12,11,12),
"value" = c(sum(example.data$A==1 &example.data$B==1), #1
sum(example.data$A==1 & example.data$B==0),#2
sum(example.data$B==1 & example.data$C==1),#3
sum(example.data$B==1 & example.data$C==0),#4
sum(example.data$B==0 & example.data$C==1),#5
sum(example.data$B==0 & example.data$C==0),#6
sum(example.data$C==1 & example.data$D==1),#7
sum(example.data$C==1 & example.data$D==0),#8
sum(example.data$C==0 & example.data$D==1),#9
sum(example.data$C==0 & example.data$D==0),#10
sum(example.data$D==1 & example.data$E==1),#11
sum(example.data$D==1 & example.data$E==0),#12
sum(example.data$D==0 & example.data$E==1),#13
sum(example.data$D==0 & example.data$E==0),#14
sum(example.data$E==1 & example.data$F==1),#15
sum(example.data$E==1 & example.data$F==0),#16
sum(example.data$E==0 & example.data$F==1),#17
sum(example.data$E==0 & example.data$F==0),#18
sum(example.data$F==1 & example.data$G==1),#19
sum(example.data$F==1 & example.data$G==0),#20
sum(example.data$F==0 & example.data$G==1),#21
sum(example.data$F==0 & example.data$G==0)))#22
nodes<-data.frame("name" = names(example.data))
example.list<-list(nodes,links)
names(example.list)<-c("nodes","links")
Моя проблема вот в чем. 1) попытка использовать эти данные в функции sankeyNetwork на самом деле не приводит к построению графика и 2) Очевидно, что этот метод будет подвержен множеству ошибок, особенно если имеется более двух целей на узел.
Я нашел пример в стеке, где человек использовал вызов сопоставления в функции dplyr :: mutate, которая выглядела многообещающей для того, что я пытаюсь выполнить, но данные имели немного другую структуру, и я действительно не знал, как получить вызов соответствия для работы с моими собственными данными.
Результатом, который я собираюсь получить, является график, показывающий количество наблюдений, перемещающихся между каждым из событий / результатов [A: F]. Итак, представьте, что каждая из колонок представляет собой успешное или неуспешное событие. Сюжет саке проиллюстрировал бы сводку общих успехов и неудач каждого события. Таким образом, все 1000 наблюдений, начиная с A, при этом 493 идут к узлу B = 1, а оставшиеся 507 идут к узлу, указывающему B = 0. Из 493 в B = 1 345 переходят к узлу, указывающему C = 1, и 148 переходят к узлу C = 0. Из 507 в B = 0 263 переходят к C = 1, а 244 переходят к C = 0, и так далее до конца событий от A до F. Надеюсь, я сделал это достаточно ясно. Любая помощь по этому вопросу будет принята с благодарностью.