4

id列(主キー)とfeatureCode(カテゴリ変数)を持つ「長い形式の」データフレームがあります。各レコードには、カテゴリ変数の1〜9個の値があります。例えば:

id  featureCode
5   PPLC
5   PCLI
6   PPLC
6   PCLI
7   PPL
7   PPLC
7   PCLI
8   PPLC
9   PPLC
10  PPLC

各機能コードが他の機能コードと一緒に使用される回数(タイトルの「ペアワイズカウント」)を計算したいと思います。この段階では、各機能コードが使用される順序は重要ではありません。結果は、行と列が機能コードであり、セルがカウントである別のデータフレームになると思います。例えば:

      PPLC  PCLI  PPL
PPLC  0     3     1
PCLI  3     0     1
PPL   1     1     0

残念ながら、私はこの計算を実行する方法がわからず、アドバイスを検索するときに空白を描画しました(正しい用語がわからないため、ほとんどの場合、私は疑っています)。

4

4 に答える 4

8

data.tableこれは@mrdwabに似たアプローチです

featureCodeである場合に最適に機能しますcharacter

library(data.table)

DT <- data.table(dat)
# convert to character
DT[, featureCode := as.character(featureCode)]
# subset those with >1 per id
DT2 <- DT[, N := .N, by = id][N>1]
# create all combinations of 2
# return as a data.table with these as columns `V1` and `V2`
# then count the numbers in each group
DT2[, rbindlist(combn(featureCode,2, 
      FUN = function(x) as.data.table(as.list(x)), simplify = F)), 
    by = id][, .N, by = list(V1,V2)]


     V1   V2 N
1: PPLC PCLI 3
2:  PPL PPLC 1
3:  PPL PCLI 1
于 2012-11-01T22:37:39.087 に答える
2

その正確な構造は必要ないが、ペアごとのカウントを取得する必要がある場合は、次のアプローチを試すことができます。

データは次のとおりです。

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   .
于 2012-11-01T18:41:18.180 に答える
1

I would use SQL, in R it is available with the sqldf Package.

Extract all possible combinations something like:

sqldf("select distinct df1.featureCode, df2.featureCode
       from df df1, df df2       
       ")

Then you can extract the result elements:
(Maybe just use a for loop for all combinations)

PCLI - PPLC

sqldf("select count(df1.id)
       from df df1, df df2
       where df1.id = df2.id
       and df1.featureCode = 'PCLI' and df2.featureCode = 'PPLC'
       ")

PPLC - PPL

sqldf("select count(df1.id)
       from df df1, df df2
       where df1.id = df2.id
       and df1.featureCode = 'PPLC' and df2.featureCode = 'PPL'
       ")

PCLI - PPL

sqldf("select count(df1.id)
       from df df1, df df2
       where df1.id = df2.id
       and df1.featureCode = 'PCLI' and df2.featureCode = 'PPL'
       ")

There is for sure some easier solution out there especially if you got more combinations to consider. Maybe a search for contingency table helps you out.

于 2012-11-01T13:24:57.047 に答える
1

概念的に理解しやすい別の解決策だと思います。ここに2部グラフがあり、このグラフを「featureCode」頂点に投影する必要があります。igraphパッケージでこれを行う方法は次のとおりです。

dat <- read.table(header = TRUE, stringsAsFactors=FALSE,
                  text = "id  featureCode                                       
                          5         PPLC                                                  
                          5         PCLI                                                  
                          6         PPLC                                                  
                          6         PCLI                                                  
                          7          PPL                                                  
                          7         PPLC                                                  
                          7         PCLI                                                  
                          8         PPLC                                                  
                          9         PPLC                                                  
                         10         PPLC")

g <- graph.data.frame(dat, vertices=unique(data.frame(c(dat[,1], dat[,2]),
                          type=rep(c(TRUE, FALSE), each=nrow(dat)))))

get.adjacency(bipartite.projection(g)[[1]], attr="weight", sparse=FALSE)

#      PPLC PCLI PPL
# PPLC    0    3   1
# PCLI    3    0   1
# PPL     1    1   0
于 2012-11-05T03:12:57.257 に答える