R: как сделать сеть networkD3 реагирующей на подмножество данных - PullRequest
1 голос
/ 07 июня 2019

Я работаю с пакетом networkD3 и не могу создать некоторые подсети с моими данными.

У меня есть набор данных, созданный таким образом (MisNodes и MisLinks предоставляются самим пакетом):

library(networkD3)

data("MisNodes")
head(MisNodes)
#              name group size
# 1          Myriel     1   15
# 2        Napoleon     1   20
# 3 Mlle.Baptistine     1   23
# 4    Mme.Magloire     1   30
# 5    CountessdeLo     1   11
# 6        Geborand     1    9

data("MisLinks")
head(MisLinks)
#   source target value
# 1      1      0     1
# 2      2      0     8
# 3      3      0    10
# 4      3      2     6
# 5      4      0     1
# 6      5      0     1

Полная сеть такова:

forceNetwork(
  Links  = MisLinks, Nodes   = MisNodes,
  Source = "source", Target  = "target",
  Value  = "value",  NodeID  = "name",
  Group  = "group",  opacity = 1)

enter image description here

Теперь я хотел бы выбрать одну из группы и увидеть только узлы этой группы и ссылки, которые имеют в качестве источника узлы в этой группе:

Итак, я попробовал это:

# here the group
k <-c(1)

# add id, to subset well
MisNodes$id <- rownames(MisNodes)

# select the desired nodes
nodes <- (MisNodes[MisNodes$group %in% k,])

# select the links that have as source the desired nodes
links <- (MisLinks[rownames(MisLinks) %in% nodes$id,])   

# rownames from 0 
rownames(nodes) <- 1:nrow(nodes)-1 

# indexing from 0 to max
links$source_ <-match(links$source, sort(unique(links$source)))-1
links$target_ <-match(links$target, sort(unique(links$target)))-1

Но результат не верный, потому что одна точка должна быть связана с центральным узлом.

enter image description here

Просматривая ссылки:

links
   source target value source_ target_
1       1      0     1       0       0
2       2      0     8       1       0
3       3      0    10       2       0
4       3      2     6       2       1
5       4      0     1       3       0
6       5      0     1       4       0
7       6      0     1       5       0
8       7      0     1       6       0
9       8      0     2       7       0
10      9      0     1       8       0

Похоже, что источники начинаются с 1, но цели от 0, но удаляя -1, это работает для первой группы, но не для других. Также общее использование k <-c(1,2,3,4,5,6,7,8,9,10) не является правильным. Как я могу заставить сеть правильно реагировать на подмножество данных?

1 Ответ

3 голосов
/ 07 июня 2019

Идентификаторы узлов используют индексацию на основе 0, и вы также должны удалить ссылки, у которых есть целевой узел, которого нет в группе, в противном случае у вас могут быть ссылки на целевые узлы, которых нет в данных ваших узлов (нев группе 1, но в других группах).

library(networkD3)

data("MisNodes")
data("MisLinks")

group <- 1

nodes <- MisNodes

# record the original id (0-based index of the node in the data)
nodes$original_id <- 0:(nrow(MisNodes) - 1)

# trim the nodes to only those in the desired group
nodes <- nodes[nodes$group == group, ]


links <- MisLinks

# trim the links to only those that have a source and target node
# within the desired group
links <- links[links$source %in% nodes$original_id & 
                 links$target %in% nodes$original_id, ]

# match the node ids in the links data to the original id of the nodes
# and reset it to the current 0-based index of the nodes
links$source <- match(links$source, nodes$original_id) - 1
links$target <- match(links$target, nodes$original_id) - 1

forceNetwork(links, nodes,
             Source = "source", Target  = "target",
             Value  = "value",  NodeID  = "name",
             Group  = "group",  opacity = 1)

enter image description here

...