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

Code for weighted adjacency matrix from df with 8 columns of string data?

提问人:AMM 提问时间:9/26/2023 最后编辑:user20650AMM 更新时间:9/26/2023 访问量:72

问:

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

我的数据目前看起来像下面的例子(但信息不同)。对于此网络分析而言,成分出现在哪一列并不重要,但共现和权重很重要。

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

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

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

R iGraph 邻接矩阵

评论

1赞 Onyambu 9/26/2023
你能展示你的预期输出吗?

答:

2赞 ThomasIsCoding 9/26/2023 #1

我想你可以创建一个发生矩阵

> table(unlist(df), c(row(df)))

             1 2 3 4 5 6
  asca       0 1 0 1 1 0
  banana     0 0 0 0 1 0
  blueberry  1 0 0 0 1 0
  lime       0 0 1 1 0 0
  mango      1 0 0 0 0 1
  pepper     0 0 0 1 0 0
  pineapple  1 1 1 0 1 0
  salt       1 0 0 1 1 0
  strawberry 0 0 0 0 1 0
  sugar      1 0 1 0 1 0
  water      1 0 1 1 1 0

或邻接矩阵

> tcrossprod(table(unlist(df), c(row(df))))

             asca banana blueberry lime mango pepper pineapple salt strawberry
  asca          3      1         1    1     0      1         2    2          1
  banana        1      1         1    0     0      0         1    1          1
  blueberry     1      1         2    0     1      0         2    2          1
  lime          1      0         0    2     0      1         1    1          0
  mango         0      0         1    0     2      0         1    1          0
  pepper        1      0         0    1     0      1         0    1          0
  pineapple     2      1         2    1     1      0         4    2          1
  salt          2      1         2    1     1      1         2    3          1
  strawberry    1      1         1    0     0      0         1    1          1
  sugar         1      1         2    1     1      0         3    2          1
  water         2      1         2    2     1      1         3    3          1

             sugar water
  asca           1     2
  banana         1     1
  blueberry      2     2
  lime           1     2
  mango          1     1
  pepper         0     1
  pineapple      3     3
  salt           2     3
  strawberry     1     1
  sugar          3     3
  water          3     4

评论

1赞 ThomasIsCoding 9/26/2023
@user20650是的,你是对的,谢谢你纠正我!我误读了这个问题,希望我的解决方案现在正常工作。
1赞 jblood94 9/26/2023 #2

如果需要按行事件,可以通过@ThomsIsCoding修改答案:

m <- tcrossprod(table(stack(as.data.frame(t(df))))[-1,])
m
#>             values
#> values       asca banana blueberry lime mango pepper pineapple salt strawberry sugar water
#>   asca          3      1         1    1     0      1         2    2          1     1     2
#>   banana        1      1         1    0     0      0         1    1          1     1     1
#>   blueberry     1      1         2    0     1      0         2    2          1     2     2
#>   lime          1      0         0    2     0      1         1    1          0     1     2
#>   mango         0      0         1    0     2      0         1    1          0     1     1
#>   pepper        1      0         0    1     0      1         0    1          0     0     1
#>   pineapple     2      1         2    1     1      0         4    2          1     3     3
#>   salt          2      1         2    1     1      1         2    3          1     2     3
#>   strawberry    1      1         1    0     0      0         1    1          1     1     1
#>   sugar         1      1         2    1     1      0         3    2          1     3     3
#>   water         2      1         2    2     1      1         3    3          1     3     4

如果需要,请将主对角线设置为 。0

diag(m) <- 0
m
#>             values
#> values       asca banana blueberry lime mango pepper pineapple salt strawberry sugar water
#>   asca          0      1         1    1     0      1         2    2          1     1     2
#>   banana        1      0         1    0     0      0         1    1          1     1     1
#>   blueberry     1      1         0    0     1      0         2    2          1     2     2
#>   lime          1      0         0    0     0      1         1    1          0     1     2
#>   mango         0      0         1    0     0      0         1    1          0     1     1
#>   pepper        1      0         0    1     0      0         0    1          0     0     1
#>   pineapple     2      1         2    1     1      0         0    2          1     3     3
#>   salt          2      1         2    1     1      1         2    0          1     2     3
#>   strawberry    1      1         1    0     0      0         1    1          0     1     1
#>   sugar         1      1         2    1     1      0         3    2          1     0     3
#>   water         2      1         2    2     1      1         3    3          1     3     0

数据:

df <- data.table::fread("name1  name2   name3   name4   name5   name6   name7   name8
               pineapple    sugar   mango   water   salt    blueberry       
               pineapple    asca                        
               sugar    pineapple   water   lime                
               lime asca    pepper  salt    water           
               blueberry    pineapple   water   salt    strawberry  banana  asca    sugar
               mango                            ")