[更新1:Matthew Dowleが指摘したように、私はdata.table
バージョン1.6.7をCR-NではなくR-Forgeで使用しています。 data.table
の以前のバージョンでは同じ動作をしません。]Rのデータフレームからデータテーブルへのセット操作の移植:重複した行を識別する方法は?
バックグラウンドとして:データフレームの行またはデータフレームのペアに対して設定操作を行うための小さなユーティリティ関数を移植しています(つまり、各行はセット内の要素)、例えば(Mathematicaの)intersect(...,'rows')
、setdiff(...,'rows')
などを模倣しており、R(Rの集合演算はベクトルとリストに限定されている)マトリクスまたはデータフレームの行は含まない)。これらの小さな関数の例を以下に示します。データフレーム用のこの機能が既に一部のパッケージまたはベースRに存在する場合は、私は提案することができます。
私はこれをデータテーブルに移行しています。現在のアプローチで必要なステップは、重複した行を見つけることです。 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:
例集合の要素は、データの行である操作機能セットこれらのヘルパー機能の一つの使用目的をここでキー値の行を見つけることですin xはyのキー値のなかにありません。このようにして、x[y]
またはy[x]
を計算すると、NAが表示される場所を見つけることができます。この使用法ではz_rbind
オブジェクトのキーの設定が可能ですが、このユースケースに限定することは望ましくありません。
注2:関連する記事については、更新data.table
パッケージでそれを実行するための優れた結果と、データフレーム上でunique
を実行している上here is a post。 this is an earlier postのデータテーブルでunique
を実行しています。
ありがとうございました!良い点 - 私は 'data.table'を更新したことを忘れていました。また、 'bug.report()'は私にとって初めてのことです。 – Iterator
Matthew、あなたのコードは 'x [-x [y、which = TRUE、nomatch = 0]]'であるべきですか? 'nomatch = 0'引数がなければ、私はこのエラーを受け取ります:' [.default(x [[s]]、irows)のエラー:0だけが負の添え字と混在する可能性があります。 @RYOGI。 – Ryogi
わからない。おそらく新しい質問で例を挙げてください。 –