如果您不需要那种确切的结构,而只需要获得成对计数,您可以尝试这种方法:
这是您的数据:
dat <- read.table(header = TRUE,
text = "id featureCode
5 PPLC
5 PCLI
6 PPLC
6 PCLI
7 PPL
7 PPLC
7 PCLI
8 PPLC
9 PPLC
10 PPLC")
我们只对id
有多个 s 的 s感兴趣featureCode
:
dat2 <- dat[ave(dat$id, dat$id, FUN=length) > 1, ]
将这些数据作为列表将很有用,因为它可以让我们lapply
用来获取成对组合。
dat2 <- split(dat2$featureCode, dat2$id)
如果您愿意,可以将下一步分解为中间部分,但基本思想是在每个列表项中创建向量的组合,然后将未列出的输出制成表格。
table(unlist(lapply(dat2, function(x)
combn(sort(x), 2, FUN = function(y)
paste(y, collapse = "+")))))
#
# PCLI+PPL PCLI+PPLC PPL+PPLC
# 1 3 1
更新:另一个问题的更好答案
稍作修改,@flodel 对另一个问题的回答在这里适用。它需要igraph
安装包 ( install.packages("igraph")
)。
dat2 <- dat[ave(dat$id, dat$id, FUN=length) > 1, ]
dat2 <- split(dat2$featureCode, dat2$id)
library(igraph)
g <- graph.edgelist(matrix(unlist(lapply(dat2, function(x)
combn(as.character(x), 2, simplify = FALSE))), ncol = 2, byrow=TRUE),
directed=FALSE)
get.adjacency(g)
# 3 x 3 sparse Matrix of class "dgCMatrix"
# PPLC PCLI PPL
# PPLC . 3 1
# PCLI 3 . 1
# PPL 1 1 .