2017-10-23 3 views
1

Ich versuche dem Beispiel des R-Ports von d3Network zu folgen, um ein Sankey-Plot zu erstellen (wie hier angegeben: https://christophergandrud.github.io/networkD3/). Ich lade die folgende Beispiel „Energie“ Daten-Set:NetworkD3 Sankey-Diagramm in R: Wie berechnet man den Wert für jede Verbindung?

# Load energy projection data 

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

    Energy <- jsonlite::fromJSON(URL) 

importieren „Energie“-Datensatz erzeugt zwei neue data.frames; Knoten und Links. das folgende Format einen Blick auf die Links Datennahme zeigt:

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 

Die Spalte „Quelle“ den Knoten Ursprungs anzeigt, zeigt die Spalte „Ziel“ den Zielknoten, während die Spalte „Wert“ den Wert angibt, jeder einzelne Link.

Obwohl dies konzeptionell ziemlich einfach ist, habe ich enorme Schwierigkeiten, einen Datensatz, mit dem ich arbeite, im selben Format wie der Energy$links data.frame zu bekommen. Ich konnte meine Daten in folgendem Format bekommen, aber eine vollständige leer bin Zeichnung auf, wie ich es weiter verwandeln könnte:

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 

Was ich möchte in der Lage sein wird zu tun, um die Anzahl der Unique Clients aggregieren für jeden Link. Zum Beispiel sollte in der obigen Teilmenge von Daten aufgrund des Clients 18295 der Link für "1 Community Services" zu "2 Housing" einen Wert von eins haben (ebenso wie die Links für "2 Housing" zu "3 Housing" "sowie" 3 Gehäuse "bis" 4 Gehäuse "). Daher möchte ich in der Lage sein, die Daten im selben Format wie Energy$links im Sankey-Diagrammbeispiel zu erhalten.

Antwort

0

Versuchen Sie folgendes:

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

und dass die Verwendung mit 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') 
Verwandte Themen