如何使用目标向量对data.table进行排序

dpu*_*leo 6 r 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
Run Code Online (Sandbox Code Playgroud)

我有以下矢量

k <- c("2","3","1")
Run Code Online (Sandbox Code Playgroud)

我想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
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?如果我使用DT[order(k)]我获得原始数据的子集,这不是我想要的.

Ric*_*ven 10

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
Run Code Online (Sandbox Code Playgroud)

实际上DT[order(match(y, k))]也可以工作,但为了match()以防万一,为同一个类创建参数可能是最安全的.

注意: match()在某些情况下,已知是次优的.如果您有大量行,则可能需要切换到fastmatch::fmatch更快的匹配.