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

时间:2016-01-08 19:44:59

标签: 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

我有以下载体

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

我想使用k作为目标向量,使用DTy进行排序,并得到类似的内容。

> 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)],我会得到原始数据的子集,而这不是我想要的。

2 个答案:

答案 0 :(得分: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

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

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

答案 1 :(得分: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))]

或(来自Richard的评论)

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"]