循环遍历行并记录匹配对

时间:2014-01-13 04:04:54

标签: r social-networking

我正在尝试根据看起来像这样的表来编译用于社交网络图的边列表:

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

任何帮助将不胜感激。 提前谢谢你!

1 个答案:

答案 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正在运行的情况下需要这样做。