web-dev-qa-db-ja.com

Rのデータテーブルから一意の行を抽出する

データフレームとマトリックスからデータテーブルに移行していますが、データテーブルから一意の行を抽出するソリューションが見つかりません。 FAQとイントロビネットにはまだ回答がありませんが、[,J]表記について何か欠けているものがあると思います。一意の行を抽出するにはどうすればよいですか?データフレームに変換し直すことなく?

次に例を示します。

library(data.table)
set.seed(123)
a <- matrix(sample(2, 120, replace = TRUE), ncol = 3)
a <- as.data.frame(a)
b <- as.data.table(a)

# Confirm dimensionality
dim(a) # 40  3
dim(b) # 40  3

# Unique rows using all columns
dim(unique(a))  # 8 3
dim(unique(b))  # 34 3

# Unique rows using only a subset of columns
dim(unique(a[,c("V1","V2")]))   # 4 2
dim(unique(b[,list(V1,V2)]))    # 29 2

関連する質問:この動作は、Unixのuniq関数の場合と同様に、データが並べ替えられていない結果ですか?

27
Iterator

Data.table v1.9.8より前は、unique.data.tableメソッドのデフォルトの動作では、一意の組み合わせを返す列を決定するためにキーを使用していました。 keyNULL(デフォルト)の場合、元のデータセットが返されます(OPの状況と同様)。

Data.table 1.9.8以降では、unique.data.tableメソッドはデフォルトですべての列を使用します。これは、ベースRのunique.data.frameと一致しています。キー列を使用するには、明示的にby = key(DT)uniqueに入れます(keyの呼び出しでDTをdata.tableの名前に置き換えます)。

したがって、古い動作は次のようなものになります

library(data.table) v1.9.7-
set.seed(123)
a <- as.data.frame(matrix(sample(2, 120, replace = TRUE), ncol = 3))
b <- data.table(a, key = names(a))
## key(b)
## [1] "V1" "V2" "V3"
dim(unique(b)) 
## [1] 8 3

Data.table v1.9.8以降では、

b <- data.table(a) 
dim(unique(b)) 
## [1] 8 3
## or dim(unique(b, by = key(b)) # in case you have keys you want to use them

またはコピーなし

setDT(a)
dim(unique(a))
## [1] 8 3
28
user399470

Sethが述べたように、data.tableパッケージは進化しており、これに対して最適化された関数を提案しています。

ドキュメントを使いたくないすべての人にとって、ここにあなたが望むことをするための最も速くて最もメモリ効率の良い方法があります:

_uniqueN(a)
_

また、列のサブセットのみを選択する場合は、「by」引数を使用できます。

uniqueN(a,by = c('V1','V2'))

編集:コメントで述べたように、これは一意の行の数のみを提供します。一意の値を取得するには、代わりにuniqueを使用します。

unique(a)

そしてサブセットの場合:

unique(a[c('V1',"V2")], by=c('V1','V2'))

7
Sacha