想象一下我有以下数据:
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)
}
}
所以,我想知道的是
team_id
生成独立网络的最佳方法是什么?team_id
的结果图形对象,以便以后对其进行分析? 如果在网络分析范式中还有更明显的方法,请告诉我。
答案 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)