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