Схема NetworkD3 Санки в R: Как рассчитать значение для каждой ссылки?

1

Я пытаюсь следовать примеру порта R d3Network, чтобы создать Sankey Plot как разработанный (как указано здесь: 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)

Импорт данных "Energy" генерирует два новых data.frames; узлов и ссылок. Взгляд на данные ссылок показывает следующий формат:

    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$links 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 Community Services" на "2 Housing" должна иметь значение 1 (как и ссылки для "2 жилья" на "3 жилья" "а также" 3 жилья "на" 4 жилья "). Таким образом, я хочу, чтобы данные были получены в том же формате, что и Energy$links на примере диаграммы Sankey.

Теги:
d3.js
dplyr
networkd3

1 ответ

0

Попробуй это:

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')

Ещё вопросы

Сообщество Overcoder
Наверх
Меню