91

編集 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 のキーでのみ動作するようです。

助言がありますか?

乾杯、デイビー

>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")
4

5 に答える 5

111

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

From?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)]
)

unique1 つの列をキーとして呼び出す:

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

于 2012-08-03T09:04:08.657 に答える
9

あなたの例data.tableで...

> dt<-data.table(V1 = c("B", "A", "A", "A", "A", "A", "C", "C", "E", "G"), V2 = c("A", "B", "B", "B", "C", "D", "D", "D", "F", "G"))
> setkey(dt,V2)

次のテストを検討してください。

> haskey(dt) # obviously dt has a key, since we just set it
[1] TRUE

> haskey(dt[,list(V1,V2)]) # ... but this is treated like a "new" table, and does not have a key
[1] FALSE

> haskey(dt[,.SD]) # note that this still has a key
[1] TRUE

そのため、テーブルの列を一覧表示してから取得できます。すべての列にキーを設定したり、@Andrie のソリューションで必要なように (および @MatthewDowle によって編集された)unique()キーを (に設定して) ドロップしたりする必要はありません。 NULL)。@Pop と @Rahul によって提案されたソリューションは、私にとってはうまくいきませんでした。

以下の試行 3 を参照してください。これは、最初の試行と非常によく似ています。あなたの例は明確ではなかったので、なぜうまくいかなかったのかわかりません。また、質問を投稿したのは数か月前だったので、data.table更新された可能性がありますか?

> unique(dt) # Try 1: wrong answer (missing V1=C and V2=D)
   V1 V2
1:  B  A
2:  A  B
3:  A  C
4:  A  D
5:  E  F
6:  G  G

> dt[!duplicated(dt)] # Try 2: wrong answer (missing V1=C and V2=D)
   V1 V2
1:  B  A
2:  A  B
3:  A  C
4:  A  D
5:  E  F
6:  G  G

> unique(dt[,list(V1,V2)]) # Try 3: correct answer; does not require modifying key
   V1 V2
1:  B  A
2:  A  B
3:  A  C
4:  A  D
5:  C  D
6:  E  F
7:  G  G

> setkey(dt,NULL)
> unique(dt) # Try 4: correct answer; requires key to be removed
   V1 V2
1:  B  A
2:  A  B
3:  A  C
4:  A  D
5:  C  D
6:  E  F
7:  G  G
于 2013-01-16T02:50:43.143 に答える
1

unique(df)あなたの例で動作します。

于 2012-08-03T09:03:29.623 に答える
0

使用できる data.table 表記を維持します。

unique(df[, .(V1, V2, V3), nomatch=0 ])

こちらのようにhttps://stackoverflow.com/a/31875208/10087503

これとマグマのバージョンの速度を比較していません。

于 2020-05-20T09:54:41.733 に答える