2011-10-19 4 views
6

[更新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 postthis is an earlier postのデータテーブルでuniqueを実行しています。

答えて

6

duplicated.data.tableは同じ修正が必要ですunique.data.table [編集:今すぐv1.7.2で完了]別のバグレポートを提出してください:bug.report(package="data.table")他の人に見てもらうために、すでにCR-1.6.6ではなく、R-Forgeのv1.6.7を使用しています。ユーザーのために簡単、かつそのリンクことを確認するためにもFR#1384(新「ではない」と 'whichnaの主張?)

x[-x[y,which=TRUE]] 

参照:注1に、イディオムを「参加しない」があります

しかし、詳細については、keys that don't matchスレッドに進みます。


更新。 v1.8.3では、not-joinが実装されました。

DT[-DT["a",which=TRUE,nomatch=0],...] # old idiom 
DT[!"a",...]       # same result, now preferred. 
+0

ありがとうございました!良い点 - 私は 'data.table'を更新したことを忘れていました。また、 'bug.report()'は私にとって初めてのことです。 – Iterator

+0

Matthew、あなたのコードは 'x [-x [y、which = TRUE、nomatch = 0]]'であるべきですか? 'nomatch = 0'引数がなければ、私はこのエラーを受け取ります:' [.default(x [[s]]、irows)のエラー:0だけが負の添え字と混在する可能性があります。 @RYOGI。 – Ryogi

+0

わからない。おそらく新しい質問で例を挙げてください。 –

関連する問題