【问题标题】:Turning data.frame into adjacency matrix lists does not show values (in R)将 data.frame 转换为邻接矩阵列表不显示值(在 R 中)
【发布时间】:2021-07-14 02:09:42
【问题描述】:

我有一个包含 4 列(发送者、接收者、年份和值)的 data.frame。我想创建一个列表,其中每年都有一个包含值的发送者和接收者的邻接矩阵。

MVE 是

df = data.frame(sender = c("a","a","b","c","d","d","d","b","e","e"), 
                receiver = c("b","d","a","a","b","a","c","e","c","a"), 
                value = 1:10,
                year= c(2000,2000,2001,2002,2002,2002,2003,2003,2003,2004))

我还有一个需要与之匹配的国家/地区列表

country_list = data.frame(country = c("a","b","c","d","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[,1]==dyad[i,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

我的错误是什么?

【问题讨论】:

    标签: r list matrix igraph


    【解决方案1】:

    一种方法可能是igraph 包。

    我们可以使用igraph::graph_from_data_frame 为每一年创建一个图表。我们可以使用vertices = 参数包含所有可能的顶点。否则,只会包含有边的顶点。

    创建加权图后,我们可以使用as_adjattr = "value" 来创建具有矩阵中值的邻接矩阵。 sparse = FALSE 让您 0s 担任其他职位。

    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
    

    【讨论】:

      【解决方案2】:

      你可以试试下面的代码

      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
      

      【讨论】:

      • @IanCampb 感谢您的反馈。是的,你是对的。我遵循了set_edge_attr 的习惯,但这里没有必要。我更新了我的答案。
      【解决方案3】:

      更改此部分:

            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[,1]==dyad[i,2])
              matrix[partner1, partner2]<- dyad[i,3]
              
            }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-12-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-20
        相关资源
        最近更新 更多