当前位置: 首页 > 知识库问答 >
问题:

R中的NetworkD3 Sankey图:如何计算每个链接的价值?

羊舌航
2023-03-14

我试图按照d3Network的R端口的例子来创建一个桑基情节(如下所述:https://christophergandrud.github.io/networkD3/)。我加载以下示例“能量”数据集:

    # Load energy projection data

    URL <- paste0("https://cdn.rawgit.com/christophergandrud/networkD3/",
    "master/JSONdata/energy.json")

    Energy <- jsonlite::fromJSON(URL)

导入“能量”数据集会生成两个新的数据帧;节点和链接。查看链接数据可发现以下格式:

    head(Energy$links)
      source target   value
  1        0      1 124.729
  2        1      2   0.597
  3        1      3  26.862
  4        1      4 280.322
  5        1      5  81.144
  6        6      2  35.000

“源”列表示源节点,“目标”列表示目标节点,而“值”列表示每个单独链接的值。

尽管这在概念上相当简单,但我在获取与Energy$link格式相同的数据集时遇到了巨大的困难data.frame.我已经能够以以下格式获取我的数据,但在如何进一步转换它方面却一片空白:

   head(sampleSankeyData, n = 10L)
    clientID                node1
      <int>                <chr>
 1     23969 1 Community Services
 2     39199      1 Youth Justice
 3     23595      1 Mental Health
 4     15867 1 Community Services
 5     18295            3 Housing
 6     18295            2 Housing
 7     18295 1 Community Services
 8     18295            4 Housing
 9     15253            1 Housing
 10    27839 1 Community Services 

我希望能够做的是聚合每个链接的唯一客户端的数量。例如,在上面的子集数据中,由于客户端 18295,“1 个社区服务”到“2 个住房”的链接的值应为 1(“2 个住房”到“3 个住房”以及“3 个住房”到“4 个住房”的链接也应该有 1)。因此,我希望能够以与桑基图示例中的 Energy$链接相同的格式获取数据。

共有1个答案

吕俊哲
2023-03-14

试试这个:

library(tidyverse)
library(stringr)
df <- tribble(
~number, ~clientID,         ~node1,
1 ,    23969, '1 Community Services',
2 ,    39199,      '1 Youth Justice',
3 ,    23595,      '1 Mental Health',
4 ,    15867, '1 Community Services',
5 ,    18295,            '3 Housing',
6 ,    18295,            '2 Housing',
7 ,    18295, '1 Community Services',
8 ,    18295,            '4 Housing',
9 ,    15253,            '1 Housing',
10,    27839, '1 Community Services')

df2 <- mutate(df, step=as.numeric(str_sub(node1, end=1))) %>%
  spread(step, node1, sep='_') %>%
  group_by(clientID) %>%
  summarise(step1 = sort(unique(step_1))[1],
            step2 = sort(unique(step_2))[1],
            step3 = sort(unique(step_3))[1],
            step4 = sort(unique(step_4))[1])

df3 <- bind_rows(select(df2,1,source=2,target=3),
            select(df2,1,source=3,target=4),
            select(df2,1,source=4,target=5)) %>%
  group_by(source, target) %>%
  summarise(clients=n())

并将其与networkD3一起使用…

links <- df3 %>% 
  dplyr::ungroup() %>% # ungroup just to be safe
  dplyr::filter(!is.na(source) & !is.na(target)) # remove lines without a link

# build the nodes data frame based on nodes in your links data frame
nodeFactors <- factor(sort(unique(c(links$source, links$target))))
nodes <- data.frame(name = nodeFactors)

# convert the source and target values to the index of the matching node in the 
# nodes data frame
links$source <- match(links$source, levels(nodeFactors)) - 1
links$target <- match(links$target, levels(nodeFactors)) - 1

# plot
library(networkD3)
sankeyNetwork(Links = links, Nodes = nodes, Source = 'source', 
              Target = 'target', Value = 'clients', NodeID = 'name')
 类似资料:
  • 我有一个数据文件如下例,但大得多 我必须计算Y1和Y2的每个3个相同名称(第一列)的平均值。然后分别用Y1和Y2的每个名称的平均值制作一个条形图。因此,在x轴上,我将有名称,在y轴上将有平均值。任何人都可以帮我吗?

  • 问题内容: 我可以列出所有目录 我试图使用以下命令列出每个目录的内容并计算每个目录中的文件数 但这是求和的总和 有没有一种方法可以计算每个目录中的文件数? 问题答案: 假设您已找到GNU,请让其查找目录,然后让bash进行其余操作:

  • 问题内容: 作为Web开发人员,您经常会遇到一些问题,如果有类似价值计算之类的问题,很容易解决。 我经常想知道为什么无法在CSS中执行以下操作: 例如,这将解决您想要垂直对齐元素时遇到的一些问题。现在很难使用CSS垂直对齐元素,并且会产生相当大的开销。 在您知道元素的固定高度的情况下,您不需要这样做。但是,一旦高度发生变化(较长的文字等),您就会迷上了一个元素的总高度。 使用附加的JS可以轻松解决

  • 问题内容: 最近在一次采访中我遇到了编程问题。 有2个链接列表。每个节点存储一个从1到9的值(指示数字的一个索引)。因此123将是链表1-> 2-> 3 任务是创建一个函数: 这将返回2个链表争论中的值之和。 如果数组a为:1-> 2-> 3-> 4 数组b为:5-> 6-> 7-> 8 答案应该是:6-> 9-> 1-> 2 这是我的算法: 遍历a和b中的每个节点,获取作为整数的值并将其相加。使

  • 问题内容: 已关闭 。这个问题需要细节或说明。它当前不接受答案。 想改善这个问题吗? 添加详细信息并通过编辑此帖子来澄清问题。 11个月前关闭。 改善这个问题 我有一个清单: 我想要另一个具有三个值均值的列表,因此新列表为: 新列表中只有6个值,因为第一个元素中只有18个元素。 我正在寻找一种精巧的方法来完成此操作,并为大量列表提供最少的步骤。 问题答案: 您可以在3个间隔中迭代使用for循环

  • 问题内容: 我有这些表: 我如何计算这些列的总价: 对于每种产品: 适用于所有含运费的产品 问题答案: 您可以通过访问属性来检索 _数据透视_表的列,该属性已经存在了很长时间了 默认情况下,只有模型关键点会出现在枢轴对象上。如果数据透视表包含额外的属性,则在定义关系时必须指定它们: 在您的情况下,您可以像下面的代码中那样定义关系: 现在,可以通过属性(例如)访问表上的列。 最后,这是计算订单总数的