【问题标题】:How to calculate the total from each cycles by using igraph in R?如何使用 R 中的 igraph 计算每个周期的总数?
【发布时间】:2020-02-01 11:57:27
【问题描述】:

我有一个如下的数据框:

h = data.frame(fr  = c('A','A','X','E','B','W','C','Y'),
               t   = c('B','E','Y','C','A','X','A','W'),
               Amt = c( 40, 30, 55, 10, 33, 78, 21, 90))

我找到了所有可能的以最小顶点数开始的顶点序列 通过使用r igraph find all cycles 作为参考。 结果如下:

[[1]]
A E C A 
1 3 6 1 

[[2]]
A B A 
1 4 1 

[[3]]
X Y W X 
2 7 5 2 

现在我想

  • 计算每个周期的总和

  • 每个周期的边数

应该是这样的:

A - B - A : 40 + 33 = 73 ;边数:2

A - E - C - A : 30 + 10 + 21 = 61 ;边数:3

X - Y - W - X : 55 + 90 + 78 = 223 ;边数:3

有没有人想用 R 来计算?那将是非常感谢!


进一步编辑部分

感谢回复,我可以计算上面的两项了!! 但是,我在这里遇到了一个小问题!

我不知道我遇到了什么问题,所以我无法正确计算! 甚至我修改了很多次。

应该是这样的:

[[1]]        [[2]]     [[3]]
A E C A      A B A     X Y W X

  Path            sumAmt numberOfEdges
  <fct>            <dbl>         <int>
1 "A - B - A"         73             2
2 "A - E - C - A"     61             3
3 "X - Y - W - X"    223             3

但是在我输入代码后,它无法显示第一个节点:

[[1]]        [[2]]     [[3]]
  E C A        B A       Y W X

  Path            sumAmt numberOfEdges
  <fct>            <dbl>         <int>
1 " - B - A"         33             2
2 " - E - C - A"     31             3
3 " - Y - W - X"    168             3

这是我寻找循环的代码。有什么我想念的吗??

h = data.frame(fr  = c('A','A','X','E','B','W','C','Y'),
               t   = c('B','E','Y','C','A','X','A','W'),
               Amt = c( 40, 30, 55, 10, 33, 78, 21, 90))

library(igraph)
g <- graph.data.frame(h, directed = TRUE)

Cycles = NULL
for(fr in V(g)) {
  for(t in neighbors(g, fr, mode = "out")) {
    Cycles = c(Cycles, 
    lapply(all_simple_paths(g, t, fr, mode = "out"), function(p)c(fr,p)))
  }
}

LongCycles = Cycles[which(sapply(Cycles, length) > 1)]
LongCycles[sapply(LongCycles, min) == sapply(LongCycles, `[`, 1)]

有人有想法吗?那会很有帮助!!

【问题讨论】:

标签: r sum igraph cycle calculation


【解决方案1】:

可能有更短的方法,但前提是您的数据如下(其中h 是您的金额表,all_cycles 是循环列表)-

h = data.frame(fr  = c('A','A','X','E','B','W','C','Y'),
               t   = c('B','E','Y','C','A','X','A','W'),
               Amt = c( 40, 30, 55, 10, 33, 78, 21, 90))

all_cycles <- list(
  c(A = 1, E = 3, C = 6, A = 1),
  c(A = 1, B = 4, A = 1),
  c(X = 2, Y = 7, W = 5, X = 2)
)

.. 你可以这样做:

library(dplyr)

data.frame(
  Nodes = unlist(lapply(all_cycles, names)),
  Path = unlist(lapply(seq_along(all_cycles), 
                       function(x) rep(paste(names(all_cycles[[x]]), collapse = " - "), 
                                       length(all_cycles[[x]]))))
  ) %>%
  group_by(Path) %>%
  mutate(fr = Nodes, t = lead(Nodes)) %>%
  left_join(h) %>%
  summarise(sumAmt = sum(Amt, na.rm = TRUE), numberOfEdges = sum(!is.na(t)))

获得:

# A tibble: 3 x 3
  Path          sumAmt numberOfEdges
  <fct>          <dbl>         <int>
1 A - B - A         73             2
2 A - E - C - A     61             3
3 X - Y - W - X    223             3

如果列表元素中的第一个值始终未命名,您可以这样做:

data.frame(
  Nodes = unlist(lapply(all_cycles, names)),
  id = unlist(lapply(seq_along(all_cycles), 
                       function(x) rep(x, length(all_cycles[[x]])))), stringsAsFactors = FALSE
  ) %>%
  group_by(id) %>% mutate(Nodes = replace(Nodes, Nodes == "", last(Nodes)),
                          Path = paste(Nodes, collapse = " - ")) %>%
  mutate(fr = Nodes, t = lead(Nodes)) %>%
  group_by(Path, id) %>%
  left_join(h) %>%
  summarise(sumAmt = sum(Amt, na.rm = TRUE), numberOfEdges = sum(!is.na(t)))

【讨论】:

  • 非常感谢!!但是我有个小问题!!
  • 但是我有个小问题!!我不知道为什么它不能显示第一个节点,所以我不能准确计算总和。它看起来如下: *应该是:A - B - A ; A - E - C - A *我的代码中的结果:“ - B - A”; “ - E - C - A”你知道这有什么原因吗??
  • @ChenHobbit 这是因为第一个值似乎总是未命名。我已经发布了一个解决方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-09
  • 1970-01-01
相关资源
最近更新 更多