1. ホーム
  2. r

[解決済み] data.table内の重複・非一意な行のフィルタリング

2023-03-18 14:52:41

質問

2019年を編集してください。 の変更前に質問されたものです。 data.table を2016年11月に変更したもので、現在の方法と以前の方法の両方について、以下の受理された回答を参照してください。

私は、このような data.table テーブルがあり、約250万行があります。2 つのカラムがあります。両方の列で重複している行を削除したいのです。以前は data.frame のために、私はこのようにしました。 df -> unique(df[,c('V1', 'V2')]) としていましたが、これはdata.tableではうまくいきません。試しに unique(df[,c(V1,V2), with=FALSE]) を試してみましたが、やはりdata.tableのキーにのみ作用し、行全体には作用しないようです。

何か提案はありますか?

乾杯 Davy

>dt
      V1   V2
[1,]  A    B
[2,]  A    C
[3,]  A    D
[4,]  A    B
[5,]  B    A
[6,]  C    D
[7,]  C    D
[8,]  E    F
[9,]  G    G
[10,] A    B

上記のdata.tableの中で V2 がテーブルのキーである場合、4,7,10行目のみが削除されます。

> dput(dt)
structure(list(V1 = c("B", "A", "A", "A", "A", "A", "C", "C", 
"E", "G"), V2 = c("A", "B", "B", "B", "C", "D", "D", "D", "F", 
"G")), .Names = c("V1", "V2"), row.names = c(NA, -10L), class = c("data.table", 
"data.frame"), .internal.selfref = <pointer: 0x7fb4c4804578>, sorted = "V2")

どのように解決するのですか?

v1.9.8+の場合 ( 2016年11月リリース )

から ?unique.data.table デフォルトではすべてのカラムが使用されています(これは ?unique.data.frame )

unique(dt)
   V1 V2
1:  A  B
2:  A  C
3:  A  D
4:  B  A
5:  C  D
6:  E  F
7:  G  G

あるいは by 引数を使用して、特定のカラムの一意な組み合わせを取得することもできます (以前はキーが使用されていたようなものです)。

unique(dt, by = "V2")
   V1 V2
1:  A  B
2:  A  C
3:  A  D
4:  B  A
5:  E  F
6:  G  G

v1.9.8以前のバージョン

から ?unique.data.table を呼び出すことは明らかです。 unique を呼び出すと、キーにのみ作用することは明らかです。つまり、すべてのカラムのキーをリセットしてから unique .

library(data.table)
dt <- data.table(
  V1=LETTERS[c(1,1,1,1,2,3,3,5,7,1)],
  V2=LETTERS[c(2,3,4,2,1,4,4,6,7,2)]
)

呼び出し unique を1つのカラムをキーとして呼び出す。

setkey(dt, "V2")
unique(dt)
     V1 V2
[1,]  B  A
[2,]  A  B
[3,]  A  C
[4,]  A  D
[5,]  E  F
[6,]  G  G