データフレームとマトリックスからデータテーブルに移行していますが、データテーブルから一意の行を抽出するソリューションが見つかりません。 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
関数の場合と同様に、データが並べ替えられていない結果ですか?
Data.table v1.9.8より前は、unique.data.table
メソッドのデフォルトの動作では、一意の組み合わせを返す列を決定するためにキーを使用していました。 key
がNULL
(デフォルト)の場合、元のデータセットが返されます(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
Sethが述べたように、data.tableパッケージは進化しており、これに対して最適化された関数を提案しています。
ドキュメントを使いたくないすべての人にとって、ここにあなたが望むことをするための最も速くて最もメモリ効率の良い方法があります:
_uniqueN(a)
_
また、列のサブセットのみを選択する場合は、「by」引数を使用できます。
uniqueN(a,by = c('V1','V2'))
編集:コメントで述べたように、これは一意の行の数のみを提供します。一意の値を取得するには、代わりにuniqueを使用します。
unique(a)
そしてサブセットの場合:
unique(a[c('V1',"V2")], by=c('V1','V2'))