R简化了图形边缘属性

时间:2018-05-24 13:32:35

标签: r igraph

我有一个图表,其中有多个边连接两个相同的顶点但具有不同的属性。例如,我有从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"

我想得到&#34; A,B&#34; &#34; C&#34;,&#34; A&#34;。起初我想合并边缘列表以获得

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

但我无法找到答案,(我知道如何使用包splitstackshape和csplit命令将其拆分,但奇怪的是它没有执行相反操作的功能)。

提前致谢,对不起,如果我的英语不是最好的,不是母语人士

2 个答案:

答案 0 :(得分:2)

您可以使用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

答案 1 :(得分:0)

类似于@ G5W的回答,但有tidyverse / dplyr个功能。我更喜欢分组变量(例如from&amp; 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