Rのデータフレームからデータテーブルへの設定操作を移植:重複した行を識別する方法は?

StackOverflow https://stackoverflow.com/questions/7822138

質問

更新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.
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top