如何使用 R 中的 igraph 计算每个周期的总数?
How to calculate the total from each cycles by using igraph in R?
我有一个数据框如下:
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))
我找到了所有以最小顶点号开始的可能顶点序列
使用 作为参考。
结果如下:
[[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)]
有人有想法吗?那会很有帮助!!
可能有更短的方法,但前提是您的数据如下(其中 h
是您的 table 数量,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)))
我有一个数据框如下:
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))
我找到了所有以最小顶点号开始的可能顶点序列
使用
[[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)]
有人有想法吗?那会很有帮助!!
可能有更短的方法,但前提是您的数据如下(其中 h
是您的 table 数量,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)))