Rのデータフレームからデータテーブルへの設定操作を移植:重複した行を識別する方法は?
-
27-10-2019 - |
質問
更新1:マシュー・ダウルが指摘したように、私は使用しています data.table
クランではなく、r-forgeのバージョン1.6.7。以前のバージョンでは同じ動作が表示されません data.table
.]
背景として:データフレームの行またはデータフレームのペア(つまり、各行はセットの要素です)の行で設定された操作を行うために、いくつかの小さなユーティリティ関数を移植しています。交差、設定の違いなど。これらの模倣マトラブ intersect(...,'rows')
, setdiff(...,'rows')
, 、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
コードはデータフレームに合わせて機能しますが、各機能をパターンで命名しました 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のキー値の1つではない行を見つけることです。これにより、計算するときにNASがどこに表示されるかを見つけることができます x[y]
また y[x]
. 。この使用法により、 z_rbind
オブジェクト、私はこのユースケースだけに制限したくないことを望んでいます。
注2:関連する投稿については、 これが投稿です 実行中 unique
データフレームで、更新された状態で実行するための優れた結果があります data.table
パッケージ。と これは以前の投稿です 実行中 unique
データテーブル。
解決
duplicated.data.table
同じ修正が必要です unique.data.table
GOT [編集:v1.7.2で完了]。別のバグレポートを上げてください: bug.report(package="data.table")
. 。他の人が見ているために、あなたはすでにクランで1.6.6ではなく、r-forgeからv1.6.7を使用しています。
しかし、注1には、「参加しない」イディオムがあります。
x[-x[y,which=TRUE]]
参照してください FR#1384 (新しい「not」と「whisna」の引数?)ユーザーにとってそれを容易にするために、そしてそれは 一致しないキー より詳細になるスレッド。
アップデート. 。現在、v1.8.3では、Not-Joinが実装されています。
DT[-DT["a",which=TRUE,nomatch=0],...] # old idiom
DT[!"a",...] # same result, now preferred.