【问题标题】:Use apply to create a list of adjacency matrices from dataframe in R使用 apply 从 R 中的数据框创建邻接矩阵列表
【发布时间】:2021-05-18 23:44:36
【问题描述】:

我在 3 波中与 5 所不同的学校建立了友谊的边缘列表。我想为每所学校创建一个列表,其中包含 3 个邻接矩阵(每个波一个)。我可以一个一个地做,但我想使用循环或应用函数来自动化它。

这是我在一所学校和wave中使用的代码:

school1_w1 <- filter(edges, school == 1 & wave == 1) %>% 
          graph_from_data_frame(., directed = TRUE) %>%
          as_adjacency_matrix() %>% as.matrix()

school1_w2 <- filter(edges, school == 1 & wave == 2) %>% 
          graph_from_data_frame(., directed = TRUE) %>%
          as_adjacency_matrix() %>% as.matrix()

school1_w3 <- filter(edges, school == 1 & wave == 3) %>% 
          graph_from_data_frame(., directed = TRUE) %>%
          as_adjacency_matrix() %>% as.matrix()

school1 <- list(school1_w1, school1_w2, school1_w3)

如何通过申请或循环为所有 5 所学校执行此操作?以下示例数据:

 ego  alter  wave  school
   1    4       1   1
   1    4       2   1
   1    3       3   1
   2    3       1   1
   2    4       2   1
   2    4       3   1
   3    1       1   1
   3    2       2   1
   3    3       3   1
   4    1       1   1
   4    1       2   1
   4    1       3   1
   5    8       1   2
   5    6       2   2
   5    7       3   2
   6    7       1   2
   6    7       2   2
   6    7       3   2
   7    8       1   2
   7    6       2   2
   7    6       3   2
   8    7       1   2
   8    7       2   2
   8    7       3   2
   9    10      1   3
   9    11      2   3
   9    12      3   3
  10    11      1   3
  10    11      2   3
  10    9       3   3
  11    12      1   3
  11    10      2   3
  11    12      3   3
  12    9       1   3
  12    10      2   3
  12    10      3   3
  13    14      1   4
  13    15      2   4
  13    16      3   4
  14    16      1   4
  14    16      2   4
  14    13      3   4
  15    16      1   4
  15    16      2   4
  15    16      3   4
  16    15      1   4
  16    15      2   4
  16    15      3   4
  17    20      1   5
  17    18      2   5
  17    18      3   5
  18    19      1   5
  18    20      2   5
  18    19      3   5
  19    17      1   5
  19    17      2   5
  19    17      3   5
  20    18      1   5
  20    17      2   5
  20    17      3   5

【问题讨论】:

    标签: r loops matrix apply igraph


    【解决方案1】:

    我们可以使用split + lapply

    library(igraph)
    
    result <- lapply(split(edges, list(edges$school, edges$wave)), function(x) {
      graph_from_data_frame(x, directed = TRUE) %>%
        as_adjacency_matrix() %>% as.matrix()
    })
    

    或者by

    result <- by(edges, list(edges$school, edges$wave), function(x) {
      graph_from_data_frame(x, directed = TRUE) %>%
        as_adjacency_matrix() %>% as.matrix()
    })
    

    【讨论】:

    • 虽然这给出了 1 个大列表而不是 5 个列表。可能必须循环两次才能得到它但是lapply(split(edges, edges$school), function(SD) lapply(split(SD, SD$wave), gr2mat) ) - (我把转换放在一个函数中)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-21
    • 2015-05-31
    相关资源
    最近更新 更多