6

[更新 1: Matthew Dowle が指摘したように、私はdata.tableCRAN ではなく 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

4

1 に答える 1

7

duplicated.data.table同じ修正unique.data.tableが必要です [編集: v1.7.2 で行われました]。別のバグ レポートを作成してください: bug.report(package="data.table")。他の視聴者のために、あなたはすでに CRAN の 1.6.6 ではなく、R-Forge の v1.6.7 を使用しています。

ただし、注 1 には、「参加しない」イディオムがあります。

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

FR#1384 (新しい 'not' および 'whichna' 引数?)も参照して、ユーザーが簡単に使用できるようにします。詳細については、スレッドに一致しないキーへのリンクを参照してください。


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

DT[-DT["a",which=TRUE,nomatch=0],...]   # old idiom
DT[!"a",...]                            # same result, now preferred.
于 2011-10-19T14:39:09.003 に答える