У меня проблемы с выяснением того, как составить диаграмму Санки для данных, в которых есть несколько возможностей успеха (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))
Сложность для меня заключается в том, как я могу сгенерировать данные ссылок без необходимости вручную указывать исходные цели и значения.
IЯ использовал пример Санки с этого сайта и продолжил набирать собственные данные примера как можно менее элегантно:
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) очевидно, что этот метод будет подвержен множеству ошибок, особенно если на узел приходится более 2 целей.
Я нашел пример в стеке, где человек использовал вызов match в функции 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. Я надеюсь, что я сделал этодостаточно ясно.Любая помощь по этому вопросу будет принята с благодарностью.