我有一个如下所示的数据集:
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并不重要,因为这些关系是无向的。
答案 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