R语言 代码加权邻接矩阵从df与8列的字符串数据?

mpgws1up  于 2023-09-27  发布在  其他
关注(0)|答案(2)|浏览(73)

我真的需要帮助与代码创建一个加权邻接矩阵从一个数据集;有些行包含1或2种成分,但其他行包含更多成分(最多8种)。基于数据集中独特成分的数量,所得到的矩阵可能会超过16 x16。
我的数据目前看起来像下面的例子(但有不同的信息)。对于该网络分析的目的而言,成分出现在哪一列并不重要,但同现和权重很重要。
| name1| name2| name3|名称4|名称5|名称6|名称7|名称8|
| --|--|--|--|--|--|--|--|
| 菠萝|糖|芒果|水|盐|蓝莓|||
| 菠萝|ASCA|||||||
| 糖|菠萝|水|石灰|||||
| 石灰|ASCA|胡椒|盐|水||||
| 蓝莓|菠萝|水|盐|草莓|香蕉|ASCA|糖|
| 芒果||||||||
我如何编写代码,以便它可以找到所有列中的所有同现/边,而不仅仅是前两列?这是我在尝试用R直接从这些数据中得到邻接矩阵时遇到的一个问题。我还需要保留节点(成分)的名称,这样当我创建网络图时,名称将显示出来,而不是数字,这是我遇到的另一个问题。
我有坚实的代码,从邻接矩阵为这个新项目创建网络图,但以前我手动计算样本集的加权邻接矩阵,因为我的截止日期很紧。

qojgxg4l

qojgxg4l1#

我猜你可以创建一个关联矩阵

> 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
jucafojl

jucafojl2#

如果需要逐行事件,您可以通过@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                            ")

相关问题