【发布时间】:2018-10-19 15:00:27
【问题描述】:
我无法弄清楚如何为有多种成功机会 (1) 或失败 (0) 的数据制作 sankey 图。您可以使用以下代码生成我的示例:
# 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))
对我来说棘手的部分是如何生成链接数据而无需手动指定源目标和值。
我使用了来自 this website 的 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) 显然这种方法容易出错,尤其是当每个节点有超过 2 个目标时。
我在堆栈上找到了一个示例,该示例在 dplyr::mutate 函数中使用了 match 调用,该函数看起来很有希望完成我想要完成的任务,但数据的结构略有不同,我真的不知道如何让 match 调用使用我自己的数据。
我想要的输出是一个 sankey 图,它显示了在每个事件/结果 [A:F] 之间移动的观察次数。所以想象每一列代表一个成功或不成功的事件。 sakey 图将说明每个事件的总成功和失败的总结。因此,从 A 开始的所有 1000 个观测值,其中 493 个进入 B = 1 的节点,其余 507 个进入指示 B = 0 的节点。在 B = 1 的 493 个中,345 个进入指示 C = 1 的节点,并且148 到节点 C = 0。在 B = 0 中的 507 中,263 到 C = 1 和 244 到 C = 0,等等事件 A 到 F 的其余部分。我希望我已经做到了够清楚。对此的任何帮助将不胜感激。
【问题讨论】:
-
@CJ 感谢第一部分的帮助。为了澄清我正在寻找的情节,假设所有 1000 个观察值都通过每个列变量标记为 YES 或 NO 的 2 个门中的 1 个。因此,所有 1000 人都从 A 开始,然后经过 B = YES 或 B = NO。接下来,所有 1000 人都经过 C=YES 或 C=NO。接下来,所有 1000 人都经过 D=YES 或 D=NO,等等
-
我更新了答案
标签: r dplyr sankey-diagram htmlwidgets networkd3