将双模式边缘列表转换为R中的单模式边缘列表

时间:2014-11-13 21:30:46

标签: r

我有一个如下所示的数据集:

Person  Team
  10    100
  11    100
  12    100
  10    200
  11    200
  14    200
  15    200

我想根据他们在一起的队伍来推断谁知道彼此。换句话说,我想创建一个如下所示的数据集:

Person1 Person2 Count
  10      11      2
  10      12      1
  11      12      1
  10      14      1
  10      15      1
  11      14      1
  11      15      1

结果数据集捕获可以根据原始数据集中列出的团队推断出的二元关系。 "伯爵"变量反映了二元组在团队中的实例数。此外,将哪个ID列为Person1与Person2并不重要,因为这些关系是无向的。

1 个答案:

答案 0 :(得分:1)

一个选项:

do.call(rbind,tapply(dat$Person,dat$Team,function(x)t(combn(x,2))))

#      [,1] [,2]
# [1,]   10   11
# [2,]   10   12
# [3,]   11   12
# [4,]   11   13
# [5,]   11   14
# [6,]   11   15
# [7,]   13   14
# [8,]   13   15
# [9,]   14   15
操作编辑后

编辑:

我个人会使用像igraph package这样的指定包来执行此操作,但在这里您可以分两步完成。

res <- 
setNames(do.call(rbind.data.frame,
        tapply(dat$Person,dat$Team,
               function(x)t(combn(x,2)))),
        c('Person1','Person2'))
## compute frequencies of each pair and add it to unique version of res
cbind(unique(res),
      Count=as.vector(table(paste(res[,'Person1'],res[,'Person2']))))

#         Person1 Person2 Count
# 100.1      10      11     2
# 100.2      10      12     1
# 100.3      11      12     1
# 200.2      10      14     1
# 200.3      10      15     1
# 200.4      11      14     1
# 200.5      11      15     1
# 200.6      14      15     1