微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将 data.frame 转换为邻接矩阵列表不显示值在 R 中

如何解决将 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_adjattr = "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 举报,一经查实,本站将立刻删除。