按特定顺序对data.table中的行重新排序

时间:2016-06-17 09:59:42

标签: r sorting data.table

我有var data = canvas.toDataURL(); dataURL = data.replace(/^data:image\/[^;]*/, 'data:application/octet-stream'); dataURL = dataURL.replace(/^data:application\/octet-stream/, 'data:application/octet-stream;headers=Content-Disposition%3A%20attachment%3B%20filename=Canvas.png'); var aTag = document.createElement('a'); aTag.download = 'download.png'; aTag.href = dataURL; aTag.click(); data.table

dumdt

我的行要按此特定索引顺序重新排序(首先是第三次观察,然后是第五次观察,然后是第二次观察等):

set.seed(123)
dumdt <- data.table(v1=sample(1:10, 5), v2=1:5)

所以我希望to_ord <- c(3, 5, 2, 1, 4) 成为dumdt的结果,但我也希望通过引用来做,并避免做dumdt[to_ord]

我知道我可以通过引用dumdt <- dumdt[to_ord](或setorder)对行进行重新排序,但只能按照一个或多个变量,按升序或降序排序,而不是按自定义顺序排序。
但是,如果我想按自定义顺序对列进行重新排序,而不是行,我可以使用setorderv

所以我的问题就出现了:是否有一个函数可以像setcolorder那样工作,但是行(或者使用setcolorder来做同样的事情)?

我想要的输出就像是

setorder

2 个答案:

答案 0 :(得分:13)

如果我理解正确,你可以添加一个col然后按顺序排序:

setorder(dumdt[, .r := order(to_ord)], .r)[, .r := NULL]

   v1 v2
1:  4  3
2:  6  5
3:  8  2
4:  3  1
5:  7  4

答案 1 :(得分:13)

此功能尚未(尚未)导出。在查看setorderv的来源之后,我能够提取所需的C函数调用,它可以满足您的需求,并提供自定义顺序。

library(data.table)
set.seed(123)
dumdt <- data.table(v1=sample(1:10, 5), v2=1:5)
print(dumdt)
#   v1 v2
#1:  3  1
#2:  8  2
#3:  4  3
#4:  7  4
#5:  6  5
setroworder <- function(x, neworder) {
    .Call(data.table:::Creorder, x, as.integer(neworder), PACKAGE = "data.table")
    invisible(x)
}
to_ord <- c(3, 5, 2, 1, 4)
setroworder(x=dumdt, neworder=to_ord)
print(dumdt)
#   v1 v2
#1:  4  3
#2:  6  5
#3:  8  2
#4:  3  1
#5:  7  4

然而,弗兰克提出的解决方案看起来更好一些。