gpt4 book ai didi

r - R中的桑基图 - 数据准备

转载 作者:行者123 更新时间:2023-12-03 23:21:13 25 4
gpt4 key购买 nike

我有以下数据框,其中每个患者都是一行(我只显示了其中的一个样本):

df = structure(list(firstY = c("N/A", "1", "3a", "3a", "3b", "1", 
"2", "1", "5", "3b"), secondY = c("N/A", "1", "2", "3a", "4",
"1", "N/A", "1", "5", "3b"), ThirdY = c("N/A", "1", "N/A", "3b",
"4", "1", "N/A", "1", "N/A", "3b"), FourthY = c("N/A", "1", "N/A",
"3a", "4", "1", "N/A", "1", "N/A", "3a"), FifthY = c("N/A", "1",
"N/A", "2", "5", "1", "N/A", "N/A", "N/A", "3b")), class = c("tbl_df",
"tbl", "data.frame"), row.names = c(NA, -10L))

我想绘制一个 Sankey 图,它显示了每个患者随时间推移的轨迹,我知道我必须创建节点和链接,但是我在将数据转换为完成此操作所需的格式时遇到了问题。具体来说,最有问题的问题是计算每个轨迹有多少患者,例如,从第 1 阶段到第 2 阶段的第一年有多少患者,以及所有其他组合。

任何有关数据准备的帮助将不胜感激。

Alluvial 包虽然简单易懂,但在有大量数据的情况下并不能很好地处理。

最佳答案

不太清楚您想要实现什么,因为您没有提到您想要使用的包,但是查看您的数据,如果您可以使用 alluvial,这似乎会有所帮助。包裹:

library(alluvial) # sankey plots
library(dplyr) # data manipulation
alluvial函数可以使用像你这样的广泛形式的数据,但它需要一个频率列,所以我们可以创建它,然后做图:
dats_all <- df %>%                                                   # data
group_by( firstY, secondY, ThirdY, FourthY, FifthY) %>% # group them
summarise(Freq = n()) # add frequencies

# now plot it
alluvial( dats_all[,1:5], freq=dats_all$Freq, border=NA )

enter image description here

另一方面,如果你想使用一个特定的包,你应该指定哪个。

编辑

使用 network3D 有点棘手,但您可以从中获得一些不错的结果。您需要链接和节点,并使它们匹配,因此首先我们可以创建链接:
# put your df in two columns, and preserve the ordering in many levels (columns) with paste0
links <- data.frame(source = c(paste0(df$firstY,'_1'),paste0(df$secondY,'_2'),paste0(df$ThirdY,'_3'),paste0(df$FourthY,'_4')),
target = c(paste0(df$secondY,'_2'),paste0(df$ThirdY,'_3'),paste0(df$FourthY,'_4'),paste0(df$FifthY,'_5')))

# now convert as character
links$source <- as.character(links$source)
links$target<- as.character(links$target)

现在节点是 unique() 中链接中的每个元素道路:
nodes <- data.frame(name = unique(c(links$source, links$target)))

现在我们需要每个节点都有一个链接(反之亦然),所以我们匹配它们并在数字上进行转换。注意最后的-1,因为networkD3是0个索引,这意味着数字(索引)从0开始。
links$source <- match(links$source, nodes$name) - 1
links$target <- match(links$target, nodes$name) - 1
links$value <- 1 # add also a value

现在你应该准备好绘制你的桑基了:
sankeyNetwork(Links = links, Nodes = nodes, Source = 'source',
Target = 'target', Value = 'value', NodeID = 'name')

enter image description here

关于r - R中的桑基图 - 数据准备,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56460820/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com