遍历ID列,为每个唯一ID创建一个新图

时间:2018-08-23 18:43:36

标签: r networking igraph

想象一下我有以下数据:

dat <- read.table(text="TrxID Items Quant Team_Id
Trx1 A 3 11
Trx1 B 1 11
Trx1 C 1 12
Trx2 E 3 13
Trx2 B 1 13
Trx3 B 1 14
Trx3 C 4 14
Trx4 D 1 15
Trx4 E 1 15
Trx4 A 1 15
Trx5 F 5 18
Trx5 B 3 13
Trx5 C 2 19
Trx5 D 1 20", header=T)

dat[1, ]$Team_Id <- paste0(c('11','19'), collapse = ',')
dat[6, ]$Team_Id <- paste0(c('14','13'), collapse = ',')

有些人属于多个团队,因此他们在列表中存储了多个team_id。我可以生成所有事件的邻接矩阵,然后将其转换为图形以执行网络分析,如下所示:

tabbed <- xtabs(~ TrxID + Items, data=dat, sparse = TRUE)
co_occur <- crossprod(tabbed, tabbed)
diag(co_occur) <- 0
co_occur

g <- graph.adjacency(co_occur, weighted=TRUE, mode ='undirected')
g <- simplify(g)

但是,我要对team_id列进行分组,并为每个唯一的team_id生成上述邻接矩阵和图形对象。我尝试使用for循环来实现此目的,但是鉴于我的数据集的大小,我认为这是不可行的。而且,它不能处理人们在一个以上团队中的情况(因为需要另一个for循环来遍历列表中的每个元素)。

例如,

complete_teams <- data.frame(team_id = c(11, 12, 13, 14, 15, 18, 19, 20))

for(i in complete_teams$team_id){
  if(i %in% dat$Team_Id) {
        newdata = subset(dat, Team_Id == i)
        tabbed <- xtabs(~ TrxID + Items, data=newdata, sparse = TRUE)
        co_occur <- crossprod(tabbed, tabbed)
        diag(co_occur) <- 0
        print(co_occur)
        g <- graph.adjacency(co_occur, weighted=TRUE, mode ='undirected')
        g <- simplify(g)


  }

}

所以,我想知道的是

  1. 为每个team_id生成独立网络的最佳方法是什么?
  2. 应如何存储每个team_id的结果图形对象,以便以后对其进行分析?

如果在网络分析范式中还有更明显的方法,请告诉我。

1 个答案:

答案 0 :(得分:1)

这里有一种使用by的方法。但是我在分割逗号分隔列之前正在对数据进行预处理。

create_g <- function(dx){
  tabbed <- xtabs(~ TrxID + Items, data=dx, sparse = TRUE)
  co_occur <- crossprod(tabbed, tabbed)
  diag(co_occur) <- 0
  g <- graph.adjacency(co_occur, weighted=TRUE, mode ='undirected')
  g <- simplify(g)
  g
}

我正在使用data.table拆分列,因为它是按ID组:

library(data.table)
out <- setDT(dat)[, {
  data.table(new_id = unlist(strsplit(Team_Id,",")),
  .SD)
   },Team_Id]

我们不能再使用data.table框架来应用created_g,因为结果不是嵌套列表:

by(out,out$new_id,FUN=create_g)