2017-08-25 2 views
1

「.SD」機能についてdata.tableヘルプは、各グループの最初の行を選択する方法を示しています。data.table n-1列に限定された各グループの最初の行を選択しますか?

DT = data.table(x=rep(c("b","a","c"),each=3), v=c(1,1,1,2,2,1,1,2,2), y=c(1,3,6), a=1:9, b=9:1) 
DT 

DT[, .N, by=x]       # number of rows in each group 

これは主に私のためにうまく動作しますが、私が定義するすべての列を使用する場合、それが壊れます理由は分からないので、バグかどうか疑問に思います。例:

# Selecting by n-1 columns works: 
DT[, .SD[1], by=c("x", "y", "v", "a")] 
    x y v a b 
1: b 1 1 1 9 
2: b 3 1 2 8 
3: b 6 1 3 7 
4: a 1 2 4 6 
5: a 3 2 5 5 
6: a 6 1 6 4 
7: c 1 1 7 3 
8: c 3 2 8 2 
9: c 6 2 9 1 

# The result of selecting by all columns is not what I expected: 
DT[, .SD[1], by=c("x", "y", "v", "a", "b")] 
Empty data.table (0 rows) of 5 cols: x,y,v,a,b 
+0

:そして、あなたの特定のケースのために、あなただけuniqueを使用することができますし、by列に基づいて、重複をドロップしますbyパラメータにgroup変数を渡します:https://stackoverflow.com/questions/11792527/filtering-out-duplicated-non-unique-rows-in-data-tableしかし、これはバグであるならば、私はまだ思ったんだけど。 – zkurtz

+2

'.SD'は、列ごとにグループを除外したdata.tableのすべての列です。すべての列でグループ化すると、 '.SD'はそれ以上ありません。 – christoph

+0

これらのケースを処理する関数を作成することもできます。fsd akrun

答えて

2

@christophによってコメントとして、.SDは(私は重複グループの値を保存しないように効率の目的のためであると考えている)グループ列が含まれていない、あなたがこれを行うことによってそれを確認することができます。

unique(DT[, .(name = names(.SD)), by=c('x','v')]$name) 
# [1] "y" "a" "b" 

unique(DT[, .(name = names(.SD)), by=c('x','v','a')]$name) 
# [1] "y" "b" 

だから、すべての列でグループ、.SDはそれで何もしている場合がありません。私は実際に行で重複排除しようとしているので、ここで終わった

unique(DT, by=c('x','v')) 

# x v y a b 
#1: b 1 1 1 9 
#2: a 2 1 4 6 
#3: a 1 6 6 4 
#4: c 1 1 7 3 
#5: c 2 3 8 2 

unique(DT, by=c('x','v','y','a','b')) 

# x v y a b 
#1: b 1 1 1 9 
#2: b 1 3 2 8 
#3: b 1 6 3 7 
#4: a 2 1 4 6 
#5: a 2 3 5 5 
#6: a 1 6 6 4 
#7: c 1 1 7 3 
#8: c 2 3 8 2 
#9: c 2 6 9 1 
+2

これは、' by'のすべての列を使う 'unique(DT)'だけがデフォルトの動作です。 –

関連する問題