R упростить атрибут ребра графа - PullRequest
0 голосов
/ 24 мая 2018

У меня есть граф с более чем одним ребром, соединяющим две одинаковые вершины, но с разными атрибутами.Например, у меня есть три ребра от v1 до v2, один с атрибутом A, другой с B и последний с A. Список ребер будет выглядеть примерно так:

from to  Att
1    2   A
1    2   B
1    2   A
3    4   C
1    3   A

Есть ли способ упростить этот список реберили график, так что между 1 и 2 есть только одно ребро с att = A, B?Я пробовал с

g<-graph_from_edgelist(M[,-3])
E(g)$Att<-M[,3]
g<-simplify(g,remove.multiple = TRUE,remove.loops = TRUE,edge.attr.comb=toString)

Но проблема в том, что он повторяет атрибут A. Когда я пытаюсь составить таблицу краев, я получаю

E(g)$Att
"A,B,A" "A" "C"

Я хотел бы получить "A, B "" C "," A ".Сначала я хотел объединить список краев, чтобы получить

from to  Att
1    2   A,B
3    4   C
1    3   A

Но я не смог найти ответ, (я знаю, как разделить его с помощью пакета splitstackshape и команды csplit, но, как ни странно, он не имеетфункция для выполнения противоположного действия).

Заранее спасибо, извините, если мой английский не лучший, не носитель языка

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Аналогично ответу @ G5W, но с функциями tidyverse / dplyr .Я предпочитаю, чтобы группируемые переменные ( например , from & to) назывались по имени.

library(magrittr)
EL %>% 
  dplyr::group_by(from, to) %>% 
  dplyr::summarize(
    x  = paste0(unique(Att), collapse=",")
  ) %>% 
  dplyr::ungroup()

Результат:

# A tibble: 3 x 3
   from    to x    
  <int> <int> <chr>
1     1     2 A,B  
2     1     3 A    
3     3     4 C 
0 голосов
/ 24 мая 2018

Вы можете сделать это с помощью aggregate

## Your data
EL = read.table(text="from to  Att
1    2   A
1    2   B
1    2   A
3    4   C
1    3   A",
header=TRUE)

aggregate(EL$Att, EL[,1:2], function(x) paste(unique(x), collapse=","))
  from to   x
1    1  2 A,B
2    1  3   A
3    3  4   C
...