我真的需要代码方面的帮助来从数据集创建加权邻接矩阵;有些行包含 1 或 2 种成分,但其他行包含更多成分(最多 8 种)。根据数据集中独特成分的数量,生成的矩阵可能会大于 16x16。
我的数据目前类似于下面的示例(但具有不同的信息)。就网络分析而言,成分显示在哪一列并不重要,重要的是共现和权重。
姓名1 | 名称2 | 名称3 | 名称4 | 名字5 | 姓名6 | 名字7 | 姓名8 |
---|---|---|---|---|---|---|---|
菠萝 | 糖 | 芒果 | 水 | 盐 | 蓝莓 | ||
菠萝 | 阿斯卡 | ||||||
糖 | 菠萝 | 水 | 石灰 | ||||
石灰 | 阿斯卡 | 胡椒 | 盐 | 水 | |||
蓝莓 | 菠萝 | 水 | 盐 | 草莓 | 香蕉 | 阿斯卡 | 糖 |
芒果 |
如何编写代码,以便它能够找到所有列中的所有共现/边缘,而不仅仅是前两列?这是我尝试直接在 R 中根据这些数据创建邻接矩阵时遇到的一个问题。我还需要保留节点(成分)的名称,以便当我创建网络图时,名称会显示出来,而不是显示出来。数字,我遇到的另一个问题。
我有可靠的代码,可以为这个新项目从邻接矩阵创建网络图,但之前我手动计算了样本集的加权邻接矩阵,因为我的截止日期很紧。
我认为这或多或少是如何在 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))