その正確な構造は必要ないが、ペアごとのカウントを取得する必要がある場合は、次のアプローチを試すことができます。
データは次のとおりです。
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
複数ある場合にのみ関心があります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 .