R语言 多列邻接矩阵

zte4gxcn  于 2023-02-06  发布在  其他
关注(0)|答案(1)|浏览(214)

我有一个包含20多列演员姓名的 Dataframe ,我想为它们之间的关系建立邻接矩阵,为了简单起见,假设我的 Dataframe 如下:
| 行动者1|演员2|演员3|演员4|
| - ------|- ------|- ------|- ------|
| 玛丽|安娜|摆锤|千斤顶|
| 露西|萨拉|摆锤|爱丽丝|
| 尼古拉|抢劫|不适用|不适用|
| 安杰拉|玛丽|安娜|不适用|
我想要一个邻接矩阵,在这个矩阵中,我在玛丽和安娜、鲍勃和杰克以及安吉拉之间有一条边(基本上,谁是谁,这与任何人都有关系)
我已经尝试了下面的代码,但我只会得到玛丽和安娜之间的边缘(它把0玛丽和鲍勃和鲍勃和杰克),它似乎只使前两列之间的边缘。

ig <- graph_from_data_frame(data)
matrix <- get.adjacency (ig)

我怎样才能得到我想要的邻接矩阵?

nfs0ujit

nfs0ujit1#

我觉得你漏掉了一个边缘列表graph_from_data_frame所需要的数据。

library(tidyverse)
library(igraph)
(start <- tibble::tribble(
   ~actor.1, ~actor.2, ~actor.3, ~actor.4,
     "Mary",   "Anna",    "bob",   "jack",
     "Lucy",   "Sara",    "bob",  "Alice",
  "Nicolas",    "rob",       NA,       NA,
   "Angela",   "Mary",   "Anna",       NA
  ) |> mutate(rel=row_number()))

(longlist <- pivot_longer(start,
                          cols=-rel) |> na.omit()|>
    mutate(value=factor(value)) |> select(-name))

(edgelist <- left_join(longlist,
                       longlist,
                       by=join_by(rel == rel),
                       multiple="all") |> filter(value.x!=value.y) |>
    relocate(rel,.after=everything()))

ig <- graph_from_data_frame(edgelist)
matrix <- get.adjacency (ig)

相关问题