Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 按特定顺序重新排列data.table中的行_R_Sorting_Data.table - Fatal编程技术网

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

R 按特定顺序重新排列data.table中的行,r,sorting,data.table,R,Sorting,Data.table,我有一个数据。表dumdt: set.seed(123) dumdt <- data.table(v1=sample(1:10, 5), v2=1:5) 如果我理解正确,您只需添加一个列,然后按其排序: 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 此功能尚未导出。在查看了setorderv的源代码之后,我能够

我有一个
数据。表
dumdt

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

如果我理解正确,您只需添加一个列,然后按其排序:

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
此功能尚未导出。在查看了
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

库(data.table)
种子集(123)

dumdt是否
setorder(cbind(dumdt,to_ord),to_ord)
(然后将ord设置为NULL)足够快?@EricLecoutre感谢您的评论,我不确定
cbind
的使用是否有效,但无论如何,这将改变
cbind
的未分配输出,而不是初始对象,因此不会真正有帮助。(事实上,我确信输出不会是预期的…)是的。。。的确引用总是有一些困难…将
的顺序“加倍”到domdt
的好方法,我不知道如何在上面使用顺序,不是吗?然后我们需要将
修改为_ord
以某种方式…@JS1204通过引用添加和删除行是不可能的,尽管您可以通过子集设置或使用rbind创建一个新表。如果你想删除一些东西,我想把它的to_ord值设置为NA,然后过滤掉NAs可能会起作用;但我不确定在这里添加一行意味着什么。你可以试着问一个新问题(因为我想我的评论是不够的,因为我不完全理解你所描述的问题),谢谢。我想到的情况是,
dumdt
与原来的帖子略有不同。最初的帖子是一个特例,其中
v2
to_ord
包含完全相同数量的元素,并且
v2
的所有元素都是唯一的。这对我来说就像魔术一样;-)非常感谢,你刚刚创建了我想要的功能。现在我觉得自己像个被宠坏的女孩;-)总的来说,我认为Frank的答案更正确一些,因为它只依赖于data.table中的导出函数,不像我的那样,
用于访问未导出的函数。你认为
Creorder
可以以某种方式修改,使函数不再工作吗?可能两种答案都有各自的优点/缺点。我同意Frank的答案更“适合”日常使用,但你的答案不那么“普通”,正如Frank提到的“酷的方式”:(显然,我并没有暗示Frank的答案有什么“不好的”,这也是非常好的)@Frank good point,订购两次。顺便说一句,如果有人喜欢Frank解决方案的包装:
setroworder
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
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