从 R 中的 igraph 对象列表创建纵向数据
Create longitudinal data from a list of igraph objects in R
我正在用 R 对公司网络进行分析,并试图将我的 igraph 结果导出到数据框中。
这是一个可重现的例子:
library(igraph)
sample <- data.frame(ID = 1:8, org_ID = c(5,4,1,2,2,2,5,7), mon = c("199801", "199802","199802","199802","199904","199912","200001", "200012"))
create.graphs <- function(df){
g <- graph.data.frame(d = df, directed = TRUE)
g <- simplify(g, remove.multiple = FALSE, remove.loops = TRUE)
E(g)$weight <- count_multiple(g)
#calculate global values
g$centrality <- centralization.degree(g)
#calculate local values
g$indegree <- degree(g, mode = "in",
loops = FALSE, normalized = FALSE)
return(g)
}
df.list <- split(sample, sample$mon)
g <- lapply(df.list, create.graphs)
如您所见,我有多个月的图表。我想将其导出为纵向数据,其中每一行代表一个月(每个 ID),每一列代表相应的网络度量。
到目前为止,我已经设法创建了一个数据框,但不知道如何 运行 它通过图表列表并将其放入合适的格式。另一个问题可能是图表具有不同数量的节点(有些大约有 25 个,有些超过 40 个),但理论上应该只是被我的回归模型识别为缺失。
output <- data.frame(Centrality = g$`199801`$centrality,
Indegree = g$`199801`$indegree)
output
summary(output)
我尝试为此写了一个类似于上面的函数,但不幸的是没有用。
提前感谢您阅读本文,非常感谢您的帮助
我想分享一下我是如何解决的(感谢 Dave2e 的建议)。
注意ci$monat在原始数据中定义了我的时间段,所以每个时间点一行。
sumarTable <- data.frame(time = unique(ci$monat))
sumarTable$indegree <- lapply(g, function(x){x$indegree})
sumarTable$outdegree <- lapply(g, function(x){x$outdegree})
sumarTable$constraint <- lapply(g, function(x){x$constraint})
等等
编辑:
为了导出这些值,我必须 "flatten" 列表:
sumarTable$indegree <- vapply(sumarTable$indegree, paste, collapse = ", ", character(1L))
sumarTable$outdegree <- vapply(sumarTable$outdegree, paste, collapse = ", ", character(1L))
sumarTable$constraint <- vapply(sumarTable$constraint, paste, collapse = ", ", character(1L))
我正在用 R 对公司网络进行分析,并试图将我的 igraph 结果导出到数据框中。
这是一个可重现的例子:
library(igraph)
sample <- data.frame(ID = 1:8, org_ID = c(5,4,1,2,2,2,5,7), mon = c("199801", "199802","199802","199802","199904","199912","200001", "200012"))
create.graphs <- function(df){
g <- graph.data.frame(d = df, directed = TRUE)
g <- simplify(g, remove.multiple = FALSE, remove.loops = TRUE)
E(g)$weight <- count_multiple(g)
#calculate global values
g$centrality <- centralization.degree(g)
#calculate local values
g$indegree <- degree(g, mode = "in",
loops = FALSE, normalized = FALSE)
return(g)
}
df.list <- split(sample, sample$mon)
g <- lapply(df.list, create.graphs)
如您所见,我有多个月的图表。我想将其导出为纵向数据,其中每一行代表一个月(每个 ID),每一列代表相应的网络度量。
到目前为止,我已经设法创建了一个数据框,但不知道如何 运行 它通过图表列表并将其放入合适的格式。另一个问题可能是图表具有不同数量的节点(有些大约有 25 个,有些超过 40 个),但理论上应该只是被我的回归模型识别为缺失。
output <- data.frame(Centrality = g$`199801`$centrality,
Indegree = g$`199801`$indegree)
output
summary(output)
我尝试为此写了一个类似于上面的函数,但不幸的是没有用。
提前感谢您阅读本文,非常感谢您的帮助
我想分享一下我是如何解决的(感谢 Dave2e 的建议)。
注意ci$monat在原始数据中定义了我的时间段,所以每个时间点一行。
sumarTable <- data.frame(time = unique(ci$monat))
sumarTable$indegree <- lapply(g, function(x){x$indegree})
sumarTable$outdegree <- lapply(g, function(x){x$outdegree})
sumarTable$constraint <- lapply(g, function(x){x$constraint})
等等
编辑: 为了导出这些值,我必须 "flatten" 列表:
sumarTable$indegree <- vapply(sumarTable$indegree, paste, collapse = ", ", character(1L))
sumarTable$outdegree <- vapply(sumarTable$outdegree, paste, collapse = ", ", character(1L))
sumarTable$constraint <- vapply(sumarTable$constraint, paste, collapse = ", ", character(1L))