加入两个邻接矩阵并保留值
Join two adjacency matrices and retain values
按照,是否可以连接两个邻接矩阵,并保留新行和新列的值?
基于参考中的示例,mat1
和 mat2
的并集使用 0
初始化新添加的行和列中的值。我想用邻接矩阵中的值初始化它们,保留该信息。
> mat1
Tommy Roy Addy Sam
Tommy 0 1 0 -1
Roy -1 -1 1 0
Addy 1 0 -1 0
Sam 0 0 -1 1
> mat2
Mike Roy Addy Sam Dan
Mike 0 1 0 -1 0
Roy -1 -1 1 0 1
Addy 1 0 -1 0 -1
Sam 0 0 -1 1 0
Dan 1 0 0 -1 1
complete_matrix <- function(mat, ref) {
dif <- setdiff(rownames(ref), rownames(mat))
mat <- rbind(mat, matrix(0, length(dif), ncol(mat), dimnames = list(dif, NULL)))
mat <- cbind(mat, matrix(0, nrow(mat), length(dif), dimnames = list(NULL, dif)))
return(mat)
}
> complete_matrix(mat2, mat1)
Mike Roy Addy Sam Dan Tommy
Mike 0 1 0 -1 0 0
Roy -1 -1 1 0 1 0
Addy 1 0 -1 0 -1 0
Sam 0 0 -1 1 0 0
Dan 1 0 0 -1 1 0
Tommy 0 0 0 0 0 0
例如,我希望 complete_matrix(mat2, mat1)
产生以下内容(观察 Tommy
行和列):
Mike Roy Addy Sam Dan Tommy
Mike 0 1 0 -1 0 0
Roy -1 -1 1 0 1 1
Addy 1 0 -1 0 -1 0
Sam 0 0 -1 1 0 -1
Dan 1 0 0 -1 1 0
Tommy 0 1 0 -1 0 0
dput
用于 c&P:
mat1 <- structure(c(0L, -1L, 1L, 0L, 1L, -1L, 0L, 0L, 0L, 1L, -1L, -1L,
-1L, 0L, 0L, 1L), .Dim = c(4L, 4L), .Dimnames = list(c("Tommy",
"Roy", "Addy", "Sam"), c("Tommy", "Roy", "Addy", "Sam")))
mat2 <- structure(c(0L, -1L, 1L, 0L, 1L, 1L, -1L, 0L, 0L, 0L, 0L, 1L,
-1L, -1L, 0L, -1L, 0L, 0L, 1L, -1L, 0L, 1L, -1L, 0L, 1L), .Dim = c(5L,
5L), .Dimnames = list(c("Mike", "Roy", "Addy", "Sam", "Dan"),
c("Mike", "Roy", "Addy", "Sam", "Dan")))
您可以使用 igraph
包的 union
函数来实现,这需要先将您的矩阵转换为图形,然后再将生成的图形转换回矩阵:
library(igraph)
g1 = graph_from_adjacency_matrix(mat1,weighted=T)
g2 = graph_from_adjacency_matrix(mat2,weighted=T)
g3 = union(g1,g2)
union
不会自动合并 g1 和 g2 的权重,而是将它们作为单独的属性 weight_1
和 weight_2
保留。我们可以通过取两个权重之间的最小值来组合它们,如果两个矩阵之间没有差异,这只是合并它们并删除 NA
值的一种方法。
E(g3)$weight = pmin(E(g3)$weight_1,E(g3)$weight_2,na.rm=T)
res = as.matrix(as_adj(g3,attr="weight"))
Tommy Roy Addy Sam Mike Dan
Tommy 0 1 0 -1 0 0
Roy -1 -1 1 0 -1 1
Addy 1 0 -1 0 1 -1
Sam 0 0 -1 1 0 0
Mike 0 1 0 -1 0 0
Dan 0 0 0 -1 1 1
我会:
- 将矩阵转换成单独的对矩阵(即对值),即矩阵到长
- 绑定他们,
- 决定如何处理重复的对(这里我只取第一个值...)
- 然后扩散到后背。
更新:可能 运行 distinct()
并在 group_by(ind_1, ind_2, value)
中添加 value。在spread()
?
中加填0
示例:
library(tidyverse)
mat1 <- structure(c(0L, -1L, 1L, 0L, 1L, -1L, 0L, 0L, 0L, 1L, -1L, -1L,
-1L, 0L, 0L, 1L), .Dim = c(4L, 4L), .Dimnames = list(c("Tommy",
"Roy", "Addy", "Sam"), c("Tommy", "Roy", "Addy", "Sam")))
mat2 <- structure(c(0L, -1L, 1L, 0L, 1L, 1L, -1L, 0L, 0L, 0L, 0L, 1L,
-1L, -1L, 0L, -1L, 0L, 0L, 1L, -1L, 0L, 1L, -1L, 0L, 1L), .Dim = c(5L,
5L), .Dimnames = list(c("Mike", "Roy", "Addy", "Sam", "Dan"),
c("Mike", "Roy", "Addy", "Sam", "Dan")))
mat1_l <- mat1 %>%
as.data.frame() %>%
rownames_to_column(var = "ind_1") %>%
as_tibble() %>%
gather(ind_2, value, -ind_1)
mat2_l <- mat2 %>%
as.data.frame() %>%
rownames_to_column(var = "ind_1") %>%
as_tibble() %>%
gather(ind_2, value, -ind_1)
rbind(mat1_l, mat2_l) %>%
group_by(ind_1, ind_2) %>%
slice(1) %>%
ungroup() %>%
spread(ind_2, value)
#> # A tibble: 6 x 7
#> ind_1 Addy Dan Mike Roy Sam Tommy
#> <chr> <int> <int> <int> <int> <int> <int>
#> 1 Addy -1 -1 1 0 0 1
#> 2 Dan 0 1 1 0 -1 NA
#> 3 Mike 0 0 0 1 -1 NA
#> 4 Roy 1 1 -1 -1 0 -1
#> 5 Sam -1 0 0 0 1 0
#> 6 Tommy 0 NA NA 1 -1 0
按照,是否可以连接两个邻接矩阵,并保留新行和新列的值?
基于参考中的示例,mat1
和 mat2
的并集使用 0
初始化新添加的行和列中的值。我想用邻接矩阵中的值初始化它们,保留该信息。
> mat1
Tommy Roy Addy Sam
Tommy 0 1 0 -1
Roy -1 -1 1 0
Addy 1 0 -1 0
Sam 0 0 -1 1
> mat2
Mike Roy Addy Sam Dan
Mike 0 1 0 -1 0
Roy -1 -1 1 0 1
Addy 1 0 -1 0 -1
Sam 0 0 -1 1 0
Dan 1 0 0 -1 1
complete_matrix <- function(mat, ref) {
dif <- setdiff(rownames(ref), rownames(mat))
mat <- rbind(mat, matrix(0, length(dif), ncol(mat), dimnames = list(dif, NULL)))
mat <- cbind(mat, matrix(0, nrow(mat), length(dif), dimnames = list(NULL, dif)))
return(mat)
}
> complete_matrix(mat2, mat1)
Mike Roy Addy Sam Dan Tommy
Mike 0 1 0 -1 0 0
Roy -1 -1 1 0 1 0
Addy 1 0 -1 0 -1 0
Sam 0 0 -1 1 0 0
Dan 1 0 0 -1 1 0
Tommy 0 0 0 0 0 0
例如,我希望 complete_matrix(mat2, mat1)
产生以下内容(观察 Tommy
行和列):
Mike Roy Addy Sam Dan Tommy
Mike 0 1 0 -1 0 0
Roy -1 -1 1 0 1 1
Addy 1 0 -1 0 -1 0
Sam 0 0 -1 1 0 -1
Dan 1 0 0 -1 1 0
Tommy 0 1 0 -1 0 0
dput
用于 c&P:
mat1 <- structure(c(0L, -1L, 1L, 0L, 1L, -1L, 0L, 0L, 0L, 1L, -1L, -1L,
-1L, 0L, 0L, 1L), .Dim = c(4L, 4L), .Dimnames = list(c("Tommy",
"Roy", "Addy", "Sam"), c("Tommy", "Roy", "Addy", "Sam")))
mat2 <- structure(c(0L, -1L, 1L, 0L, 1L, 1L, -1L, 0L, 0L, 0L, 0L, 1L,
-1L, -1L, 0L, -1L, 0L, 0L, 1L, -1L, 0L, 1L, -1L, 0L, 1L), .Dim = c(5L,
5L), .Dimnames = list(c("Mike", "Roy", "Addy", "Sam", "Dan"),
c("Mike", "Roy", "Addy", "Sam", "Dan")))
您可以使用 igraph
包的 union
函数来实现,这需要先将您的矩阵转换为图形,然后再将生成的图形转换回矩阵:
library(igraph)
g1 = graph_from_adjacency_matrix(mat1,weighted=T)
g2 = graph_from_adjacency_matrix(mat2,weighted=T)
g3 = union(g1,g2)
union
不会自动合并 g1 和 g2 的权重,而是将它们作为单独的属性 weight_1
和 weight_2
保留。我们可以通过取两个权重之间的最小值来组合它们,如果两个矩阵之间没有差异,这只是合并它们并删除 NA
值的一种方法。
E(g3)$weight = pmin(E(g3)$weight_1,E(g3)$weight_2,na.rm=T)
res = as.matrix(as_adj(g3,attr="weight"))
Tommy Roy Addy Sam Mike Dan
Tommy 0 1 0 -1 0 0
Roy -1 -1 1 0 -1 1
Addy 1 0 -1 0 1 -1
Sam 0 0 -1 1 0 0
Mike 0 1 0 -1 0 0
Dan 0 0 0 -1 1 1
我会:
- 将矩阵转换成单独的对矩阵(即对值),即矩阵到长
- 绑定他们,
- 决定如何处理重复的对(这里我只取第一个值...)
- 然后扩散到后背。
更新:可能 运行 distinct()
并在 group_by(ind_1, ind_2, value)
中添加 value。在spread()
?
示例:
library(tidyverse)
mat1 <- structure(c(0L, -1L, 1L, 0L, 1L, -1L, 0L, 0L, 0L, 1L, -1L, -1L,
-1L, 0L, 0L, 1L), .Dim = c(4L, 4L), .Dimnames = list(c("Tommy",
"Roy", "Addy", "Sam"), c("Tommy", "Roy", "Addy", "Sam")))
mat2 <- structure(c(0L, -1L, 1L, 0L, 1L, 1L, -1L, 0L, 0L, 0L, 0L, 1L,
-1L, -1L, 0L, -1L, 0L, 0L, 1L, -1L, 0L, 1L, -1L, 0L, 1L), .Dim = c(5L,
5L), .Dimnames = list(c("Mike", "Roy", "Addy", "Sam", "Dan"),
c("Mike", "Roy", "Addy", "Sam", "Dan")))
mat1_l <- mat1 %>%
as.data.frame() %>%
rownames_to_column(var = "ind_1") %>%
as_tibble() %>%
gather(ind_2, value, -ind_1)
mat2_l <- mat2 %>%
as.data.frame() %>%
rownames_to_column(var = "ind_1") %>%
as_tibble() %>%
gather(ind_2, value, -ind_1)
rbind(mat1_l, mat2_l) %>%
group_by(ind_1, ind_2) %>%
slice(1) %>%
ungroup() %>%
spread(ind_2, value)
#> # A tibble: 6 x 7
#> ind_1 Addy Dan Mike Roy Sam Tommy
#> <chr> <int> <int> <int> <int> <int> <int>
#> 1 Addy -1 -1 1 0 0 1
#> 2 Dan 0 1 1 0 -1 NA
#> 3 Mike 0 0 0 1 -1 NA
#> 4 Roy 1 1 -1 -1 0 -1
#> 5 Sam -1 0 0 0 1 0
#> 6 Tommy 0 NA NA 1 -1 0