如果您不需要精确的结构,只需要获取配对计数,可以尝试以下方法:
以下是您的数据:
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")
我们只关心那些有多个
featureCode
的
id
。
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 = "+")))))
更新:另一个问题有更好的答案
进行少量修改后,@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)
DT2
的地方了。 - A5C1D2H2I1M1N2O1R2T1simplify = FALSE
是一个选项,然后找出如何返回正确维度的data.table时间数据。 - mnel