使用 lapply 创建一个新的数据帧列表来总结网络分析

using lapply to create a new list of dataframes that summarises network analysis

我有一个数据列表,其中包含数据帧形式的网络。我想做的是执行一个计算多个网络属性并将它们存储在新的数据帧列表中的函数

例如:

#Create example matrices for network analysis
A = matrix( c( NA, 1, 0, 3, 1, NA, 4, 3, 1, 0, NA, 3, 1, 1, 0, NA ), nrow = 4, ncol = 4)
B = matrix( c( NA, 2, 3, 0, 4, NA, 3, 1, 0, 3, NA, 2, 0, 2, 1, NA ), nrow = 4, ncol = 4)
C = matrix( c( NA, 0, 0, 1, 2, NA, 0, 5, 1, 2, NA, 0, 3, 3, 0, NA ), nrow = 4, ncol = 4)

#transform into dataframes as this is the form they are in within my list
A <- as.data.frame(A)
B <- as.data.frame(B)
C <- as.data.frame(C)

colnames(A) <- letters[1:4]
colnames(B) <- letters[1:4]
colnames(C) <- letters[1:4]

#create list of matrices
my_list <- list(A, B, C)

#install igraph for network analysis
install.packages("igraph")
library(igraph)

然后我创建了一个函数,它成功地计算了网络属性并将它们绑定到一个新的数据帧中

##create function which summarises network properties and puts them in a data frame
network.summary <- function(data) {
  data <- as.matrix(data)
  g <- graph_from_adjacency_matrix(data, mode = c("directed"), weighted = TRUE,
                                   add.colnames = NULL, add.rownames = NA)
  centrality <- degree(g, mode='all')
  closeness <- closeness(g, mode='all')
  betweenness <- betweenness(g, directed = T,)
  network.properties <- rbind(centrality, closeness, betweenness)
}

当我要求它单独计算其中一个数据帧上的网络属性时,此函数有效,例如:

network.A <- network.summary(A)

结果

                    a    b         c   d
centrality  7.0000000 7.00 5.0000000 7.0
closeness   0.3333333 0.25 0.1666667 0.2
betweenness 1.0000000 2.00 0.0000000 0.0

我想要的是一个包含像这样的数据框的列表。但是,当我尝试在此列表中执行此功能时,它似乎只是使用以下代码创建了一个没有错误消息的空白列表

network.properties <- lapply(names(my_list), function(x) network.summary(my_list[[x]]))

我看过一些与此接近的其他问题的帖子,但似乎无法理解为什么这不起作用以及我需要添加到我的代码中的内容。

apply这个思路不错!但是,您的第一个论点是错误的。 my_list 是一个未命名的列表,这意味着 names(my_list) 将 return NULL。有几种方法可以解决这个问题:

  1. 为您的列表命名,例如 my_list = c(a = A, b = B, c = C)
my_list <- list(a = A, b = B, c = C)
(network.properties <- lapply(names(my_list), function(x) network.summary(my_list[[x]])))
#> [[1]]
#>                     a    b         c   d
#> centrality  7.0000000 7.00 5.0000000 7.0
#> closeness   0.3333333 0.25 0.1666667 0.2
#> betweenness 1.0000000 2.00 0.0000000 0.0
#> 
#> [[2]]
#>                     a         b         c         d
#> centrality  5.0000000 8.0000000 7.0000000 6.0000000
#> closeness   0.1111111 0.1428571 0.1428571 0.1666667
#> betweenness 0.0000000 3.0000000 0.0000000 1.0000000
#> 
#> [[3]]
#>                a         b   c         d
#> centrality  6.00 6.0000000 4.0 6.0000000
#> closeness   0.25 0.1428571 0.2 0.1666667
#> betweenness 2.00 0.0000000 0.0 1.0000000
  1. 更改 lapply() 调用中的参数
(network.properties <- lapply(my_list, function(x) network.summary(x)))
#> $a
#>                     a    b         c   d
#> centrality  7.0000000 7.00 5.0000000 7.0
#> closeness   0.3333333 0.25 0.1666667 0.2
#> betweenness 1.0000000 2.00 0.0000000 0.0
#> 
#> $b
#>                     a         b         c         d
#> centrality  5.0000000 8.0000000 7.0000000 6.0000000
#> closeness   0.1111111 0.1428571 0.1428571 0.1666667
#> betweenness 0.0000000 3.0000000 0.0000000 1.0000000
#> 
#> $c
#>                a         b   c         d
#> centrality  6.00 6.0000000 4.0 6.0000000
#> closeness   0.25 0.1428571 0.2 0.1666667
#> betweenness 2.00 0.0000000 0.0 1.0000000

确实,如果您将 list 应用于 lapply(),那么它会将您提供的函数应用于列表中的每个元素。这也意味着您不需要将 my_list[[x]] 添加到您提供的函数中,因为提供的函数已经应用于列表中的每个元素,即存在的 my_list[[x]。因此你可以简单地在 network.summary().

中写 x