来自 df 的带有 8 列字符串数据的加权邻接矩阵的代码?

问题描述 投票:0回答:1

我真的需要代码方面的帮助来从数据集创建加权邻接矩阵;有些行包含 1 或 2 种成分,但其他行包含更多成分(最多 8 种)。根据数据集中独特成分的数量,生成的矩阵可能会大于 16x16。

我的数据目前类似于下面的示例(但具有不同的信息)。就网络分析而言,成分显示在哪一列并不重要,重要的是共现和权重。

姓名1 名称2 名称3 名称4 名字5 姓名6 名字7 姓名8
菠萝 芒果 蓝莓
菠萝 阿斯卡
菠萝 石灰
石灰 阿斯卡 胡椒
蓝莓 菠萝 草莓 香蕉 阿斯卡
芒果

如何编写代码,以便它能够找到所有列中的所有共现/边缘,而不仅仅是前两列?这是我尝试直接在 R 中根据这些数据创建邻接矩阵时遇到的一个问题。我还需要保留节点(成分)的名称,以便当我创建网络图时,名称会显示出来,而不是显示出来。数字,我遇到的另一个问题。

我有可靠的代码,可以为这个新项目从邻接矩阵创建网络图,但之前我手动计算了样本集的加权邻接矩阵,因为我的截止日期很紧。

r igraph adjacency-matrix
1个回答
1
投票

我认为这或多或少是如何在 R 中生成转换类型表?的重复,但需要调整几行代码,所以这里是一个更新:

library(igraph)

# Split dataframe so that each row is a `path`
lst <- lapply(split(d, 1:nrow(d)), function(i) na.omit(unlist(i)))

# Get unique node names 
unique_nodes <- na.omit(unique(unlist(d)))

# Create empty graph and name nodes
g <- make_empty_graph(n=length(unique_nodes), directed=FALSE)
V(g)$name <- unique_nodes

# Read in each path
for (i in lst) {  g <- g + path(i) }

plot(g)

# Output adjacency matrix
as_adj(g, sparse=TRUE)

数据:

d <- 
structure(list(name1 = c("pineapple", "pineapple", "sugar", "lime", 
"blueberry", "mango"), name2 = c("sugar", "asca", "pineapple", 
"asca", "pineapple", NA), name3 = c("mango", NA, "water", "pepper", 
"water", NA), name4 = c("water", NA, "lime", "salt", "salt", 
NA), name5 = c("salt", NA, NA, "water", "strawberry", NA), name6 = c("blueberry", 
NA, NA, NA, "banana", NA), name7 = c(NA, NA, NA, NA, "asca", 
NA), name8 = c(NA, NA, NA, NA, "sugar", NA)), class = "data.frame", row.names = c(NA, 
-6L))
© www.soinside.com 2019 - 2024. All rights reserved.