2017-10-23 4 views
1

d3NetworkのRポートの例にしたがって、Sankey Plotを作成します(ここで述べるように:https://christophergandrud.github.io/networkD3/)。私は、次のサンプル「エネルギー」のデータセットを読み込む:「エネルギー」データセットをインポートNetworkD3 Sankey diagram in R:各リンクの価値を計算する方法は?

# Load energy projection data 

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

    Energy <- jsonlite::fromJSON(URL) 

は、2つの新しい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コミュニティサービス」から「2住宅」へのリンクは1の値を有するべきである(「2住宅」から「3住宅」へのリンク「3 Housing」から「4 Housing」まで)。このように、Sankeyの図の例では、Energy$linksと同じ形式でデータを取得したいと考えています。

答えて

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') 
関連する問題