如何解决将 data.frame 转换为邻接矩阵列表不显示值在 R 中
我有一个包含 4 列(发送者、接收者、年份和值)的 data.frame。我想创建一个列表,其中每年都有一个包含值的发送方和接收方的邻接矩阵。
MVE 是
df = data.frame(sender = c("a","a","b","c","d","e","e"),receiver = c("b","a"),value = 1:10,year= c(2000,2000,2001,2002,2003,2004))
我还有一个国家列表,我需要它来匹配
country_list = data.frame(country = c("a","e")
我尝试过的看起来像这样。我的问题是后续的邻接矩阵中没有显示正确的值。
transfer_list <- list()
for (t in 2000:2004){
matrix<-matrix(0,5,5)
rownames(matrix)<-country_list[1:5,1]
colnames(matrix)<-country_list[1:5,1]
year=which(df[,4]==t)
dyad=df[year,c(1,2)]
for (i in 1:dim(dyad)[1]){
partner1<-which(country_list[,1]==dyad[i,1])
partner2<-which(country_list[,2])
matrix[partner1,partner2]<-df[i,3]
}
transfer_list[[t-1999]]=matrix
}
2004 年从 e 转移到 a 的结果应该是 10,但是:
> transfer_list[[5]]
a b c d e
a 0 0 0 0 0
b 0 0 0 0 0
c 0 0 0 0 0
d 0 0 0 0 0
e 1 0 0 0 0
我的错误是什么?
解决方法
一种方法可能是 igraph
包。
我们可以使用 igraph::graph_from_data_frame
为每一年创建一个图表。我们可以使用 vertices =
参数包含所有可能的顶点。否则,将只包含带边的顶点。
一旦我们创建了加权图,我们就可以使用 as_adj
和 attr = "value"
使用矩阵中的值创建邻接矩阵。 sparse = FALSE
为您提供0
其他职位。
library(igraph)
result <- lapply(unique(df$year),function(x) {
g <- graph_from_data_frame(df[df$year == x,-4],vertices = unique(country_list))
as_adj(g,attr = "value",sparse = FALSE)})
names(result) <- unique(df$year)
result$`2004`
# a b c d e
#a 0 0 0 0 0
#b 0 0 0 0 0
#c 0 0 0 0 0
#d 0 0 0 0 0
#e 10 0 0 0 0
,
你可以试试下面的代码
library(igraph)
library(dplyr)
lapply(
split(df[setdiff(names(df),"year")],df$year),function(x) {
x %>%
graph_from_data_frame(vertices = country_list$country) %>%
as_adj(attr = "value",sparse = FALSE)
}
)
给出
$`2000`
a b c d e
a 0 1 0 2 0
b 0 0 0 0 0
c 0 0 0 0 0
d 0 0 0 0 0
e 0 0 0 0 0
$`2001`
a b c d e
a 0 0 0 0 0
b 3 0 0 0 0
c 0 0 0 0 0
d 0 0 0 0 0
e 0 0 0 0 0
$`2002`
a b c d e
a 0 0 0 0 0
b 0 0 0 0 0
c 4 0 0 0 0
d 6 5 0 0 0
e 0 0 0 0 0
$`2003`
a b c d e
a 0 0 0 0 0
b 0 0 0 0 8
c 0 0 0 0 0
d 0 0 7 0 0
e 0 0 9 0 0
$`2004`
a b c d e
a 0 0 0 0 0
b 0 0 0 0 0
c 0 0 0 0 0
d 0 0 0 0 0
e 10 0 0 0 0
,
更改此部分:
dyad=df[year,c(1,2,3)]
for (i in 1:dim(dyad)[1]){
partner1<-which(country_list[,1]==dyad[i,1])
partner2<-which(country_list[,2])
matrix[partner1,partner2]<- dyad[i,3]
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。