我正在尝试根据看起来像这样的表来编译用于社交网络图的边列表:
CompanyID ProjectID Year
A 1 2010
B 3 2011
C 1 2010
D 5 2012
E 1 2010
我们的想法是拥有一个在同一个项目上工作的顶点(公司)列表。所以,鉴于上述数据,我有
CompanyA CompanyB
A C
A E
C E
任何帮助将不胜感激。 提前谢谢你!
答案 0 :(得分:2)
调用您的数据框x
:
x <- read.table(header=TRUE, text='CompanyID ProjectID Year
A 1 2010
B 3 2011
C 1 2010
D 5 2012
E 1 2010')
选择具有ProjectID
的多个值的条目:
(mx <- x[ave(seq(nrow(x)), x$ProjectID, FUN=length) > 1,])
## CompanyID ProjectID Year
## 1 A 1 2010
## 3 C 1 2010
## 5 E 1 2010
现在为魔术:
do.call(rbind,
by(mx, mx$ProjectID,
FUN=function(mx)
t(apply(combn(as.numeric(mx$CompanyID), 2), 2,
function(x) levels(mx$CompanyID)[x]
)
)
)
)
## [,1] [,2]
## [1,] "A" "C"
## [2,] "A" "E"
## [3,] "C" "E"
使用您的示例数据,您可以获得相同的结果而不必包含在do.call(rbind ...
中,但在有多个ProjectID正在运行的情况下需要这样做。