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