Создайте матрицу или список смежности на основе общих свойств из фрейма данных.

У меня есть кадр данных повторяющихся элементов (строк), который в некотором смысле описывает элементы, которые разделяют некоторые свойства друг с другом. Я хотел бы выразить это отношение в виде графика.

property node
red      A
red      B
red      C
blue     A
blue     D
purple   A
purple   B

A, B и C будут связаны друг с другом, поскольку они имеют общее свойство red. A и D образуют соединение, поскольку они имеют общее свойство blue. Кроме того, A и B имеют общее свойство purple. Мы можем взвешивать элементы, которые имеют более одного общего свойства, например, A и B совместно используют свойство purple в дополнение к свойству red.

Мой вопрос в том, как мне удобно выразить это отношение с помощью R и получить матрицу смежности или просто список ребер.

matrix <- matrix(0,total_nodes,total_nodes) #initialize a matrix
for (i in property) {
   #some function to fill in the matrix 
}

diag(matrix) <- 0

person eastafri    schedule 10.07.2017    source источник
comment
Не могли бы вы объяснить причину отрицательного голосования?   -  person eastafri    schedule 10.07.2017


Ответы (1)


Прочтите свои данные:

dta <- read.table(header = TRUE, stringsAsFactors = FALSE, 
          textConnection("property node
red      A
red      B
red      C
blue     A
blue     D
purple   A
purple   B"))

Создайте ребра из набора данных, связав данные сами с собой в свойстве:

library(dplyr)

# Create edges by linking the vertices to eachother using their properties
dta <- full_join(dta, dta, c('property' = 'property')) %>% 
  # We no longer need property -> remove
  select(-property) %>% 
  # Dont allow self-loops
  filter(node.x != node.y) %>% 
  # Aggregate duplicate edges: vertices linked using multiple properties
  group_by(node.x, node.y) %>% 
  summarise(weight = n())

Теперь, когда у нас есть data.frame с ребрами, мы можем создать график:

library(igraph)
# Create graph
g <- graph_from_data_frame(dta, directed = TRUE)
# Create adjacency matrix from graph
M <- as_adjacency_matrix(g, attr = "weight")

Другим решением для получения матрицы смежности без использования igraph было бы:

library(tidyr)
M2 <- spread(dta, node.y, weight, fill = 0)
person Jan van der Laan    schedule 10.07.2017
comment
Именно то, что я хотел! Большое спасибо и особенно за использование глаголов dplyr! - person eastafri; 10.07.2017