我有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
答案 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
然而,弗兰克提出的解决方案看起来更好一些。