2016-01-08 6 views
5

を使用してdata.tableをソートするためにどのように、私は次のようdata.tableだから、ターゲットベクトル

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

> DT 
    x y 
1: b 1 
2: b 2 
3: b 3 
4: a 1 
5: a 2 
6: a 3 
7: c 1 
8: c 2 
9: c 3 

を持っていると私は、次のベクトル

k <- c("2","3","1") 

を持っている私としてk使用したいですDTを使用してyをソートし、このようなものを取得するターゲットベクトル。

> DT 
    x y 
1: b 2 
2: a 2 
3: c 2 
4: b 3 
5: a 3 
6: c 3 
7: b 1 
8: a 1 
9: c 1 

DT[order(k)]を使用すると、元のデータのサブセットが得られますが、それは私が探しているものではありません。

答えて

7

match()への呼び出しをスローします。

DT[order(match(y, as.numeric(k)))] 
# x y 
# 1: b 2 
# 2: a 2 
# 3: c 2 
# 4: b 3 
# 5: a 3 
# 6: c 3 
# 7: b 1 
# 8: a 1 
# 9: c 1 

実はDT[order(match(y, k))]も同様に動作しますが、それは念のために同じクラスのmatch()に引数を作るために、おそらく最も安全です。

注:match()は場合によっては準最適であることが知られています。行数が多い場合は、高速照合のためにfastmatch::fmatchに切り替えることをお勧めします。

2

あなたはこれを行うことができます。

DT = data.table(x=rep(c("b","a","c"),each=3), y=c(1,2,3)) 
k <- c("2","3","1") 
setkey(DT,y) 
DT[data.table(as.numeric(k))] 

かをあなただけの `DTを行うことができます今日で

DT = data.table(x=rep(c("b","a","c"),each=3), y=c(1,2,3)) 
k <- c("2","3","1") 
DT[data.table(y = as.numeric(k)), on = "y"] 
+1

(リチャードのコメントから)[data.table(Y = as.numeric(K) )、on = "y"] '' y 'をマージしてキーを設定する必要はありません –