将边缘列表转换为双模式网络矩阵

converting edgelist to two-mode network matrix

HAVE 是奇数双模网络的边列表。 actor中的人都是主要的获奖演员; supporter 中的人是在一个或多个 films 中扮演配角的其他演员。注意:actor 包括 supporter 一些 成员,但不是全部,这就是为什么我将其视为双模数据。

index   actor   supporter   films
1       f1      f4          2
2       f1      f2          1
3       f1      f7          6
4       f1      f5          5
5       f2      f6          6
6       f2      f3          3
7       f3      f1          9
8       f3      f4          1
9       f3      f2          4

WANT 是由 HAVE 组成的双模式邻接矩阵 - 行名代表 actor 中的所有 id;列名称包括 actorsupporter 中的每个名称。

    f1  f2  f3  f4  f5  f6  f7
f1  0   1   0   2   5   0   6
f2  0   0   3   0   0   6   0
f3  9   4   0   1   0   0   0

如何将 HAVE 转换为 WANT?由于 (a) 每个模式的 ID 具有相同的命名方案和 (b) 不对称性(例如,f2 led和 f1 支持过一次,但 f1 从未领导过 f2 支持的电影)。

我想你可以使用你最喜欢的 reshaper 函数:

dat <- read.table(text ="index   actor   supporter   films
1       f1      f4          2
2       f1      f2          1
3       f1      f7          6
4       f1      f5          5
5       f2      f6          6
6       f2      f3          3
7       f3      f1          9
8       f3      f4          1
9       f3      f2          4", header=TRUE)

adj <- reshape(dat[,-1], v.names = "films", idvar = "actor", 
               timevar = "supporter", direction = "wide")
adj[is.na(adj)] <- 0
adj[,order(colnames(adj))]
#   actor films.f1 films.f2 films.f3 films.f4 films.f5 films.f6 films.f7
# 1    f1        0        1        0        2        5        0        6
# 5    f2        0        0        3        0        0        6        0
# 7    f3        9        4        0        1        0        0        0