2016-01-08 63 views
5

所以,我有以下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 

來排序data.table和我有以下矢量

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 = 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

如今你可以做'DT [data.table(Y = as.numeric(K) ),on =「y」]'在'y'上合併,而不必設置密鑰 –