[更新 1: Matthew Dowle が指摘したように、私はdata.table
CRAN ではなく R-Forge でバージョン 1.6.7 を使用しています。の以前のバージョンでは、同じ動作は見られませんdata.table
。]
背景として:データフレームの行またはデータフレームのペア(つまり、各行はセット内の要素)でセット操作を行うために、いくつかの小さなユーティリティ関数を移植しています。たとえば、ユニーク - リスト、ユニオン、これらは Matlab のintersect(...,'rows')
、setdiff(...,'rows')
などを模倣しており、R に対応するものはないようです (R の集合操作はベクトルとリストに限定されますが、行列やデータ フレームの行には限定されません)。これらの小さな関数の例を以下に示します。データ フレームのこの機能がパッケージまたはベース R に既に存在する場合は、提案をお待ちしています。
これらをデータ テーブルに移行してきましたが、現在のアプローチで必要な手順の 1 つは、重複した行を見つけることです。を実行するduplicated()
と、データ テーブルにはキーが必要であることを示すエラーが返されます。これは残念な障害です - 普遍的な解決策ではなく、計算コストを追加するキーを設定する以外に、重複したオブジェクトを見つける他の方法はありますか?
再現可能な例を次に示します。
library(data.table)
set.seed(0)
x <- as.data.table(matrix(sample(2, 100, replace = TRUE), ncol = 4))
y <- as.data.table(matrix(sample(2, 100, replace = TRUE), ncol = 4))
res3 <- dt_intersect(x,y)
次のエラー メッセージが表示されます。
Error in duplicated.data.table(z_rbind) : data table must have keys
コードはデータ フレームに対してそのまま機能しますが、各関数に pattern という名前を付けましたdt_operation
。
この問題を回避する方法はありますか? キーの設定は整数に対してのみ機能します。これは、入力データに対して想定できない制約です。では、データ テーブルを使用する賢い方法を見逃しているのではないでしょうか?
セットの要素がデータの行であるセット演算関数の例:
dt_unique <- function(x){
return(unique(x))
}
dt_union <- function(x,y){
z_rbind <- rbind(x,y)
z_unique <- dt_unique(z_rbind)
return(z_unique)
}
dt_intersect <- function(x,y){
zx <- dt_unique(x)
zy <- dt_unique(y)
z_rbind <- rbind(zy,zx)
ixDupe <- which(duplicated(z_rbind))
z <- z_rbind[ixDupe,]
return(z)
}
dt_setdiff <- function(x,y){
zx <- dt_unique(x)
zy <- dt_unique(y)
z_rbind <- rbind(zy,zx)
ixRangeX <- (nrow(zy) + 1):nrow(z_rbind)
ixNotDupe <- which(!duplicated(z_rbind))
ixDiff <- intersect(ixNotDupe, ixRangeX)
diffX <- z_rbind[ixDiff,]
return(diffX)
}
注 1: これらのヘルパー関数の使用目的の 1 つは、x のキー値が y のキー値にない行を見つけることです。x[y]
このようにして、またはを計算するときに NA が表示される場所を見つけることができますy[x]
。この使用法ではz_rbind
オブジェクトのキーを設定できますが、この使用例だけに限定したくはありません。
注 2: 関連する投稿として、データ フレームでの実行に関する投稿がありunique
ます。更新されたdata.table
パッケージで実行すると、優れた結果が得られます。これは、データ テーブルでの実行に関する以前の投稿です。unique