对于R data.table,如何确定当前的顺序
我正在为setorder()寻找一个类似key()函数为setkey()所做的东西。也就是说,我在fn3的第一行中放了什么?目前,fn1()的最后一行输出是1:10,而不是10:1对于R data.table,如何确定当前的顺序,r,data.table,R,Data.table,我正在为setorder()寻找一个类似key()函数为setkey()所做的东西。也就是说,我在fn3的第一行中放了什么?目前,fn1()的最后一行输出是1:10,而不是10:1 fn1 <- function() { dt1 <- data.table(a = 1:10, b = 10:1) setkey(dt1, a) print(dt1[, b]) fn2(dt1) print(dt1[, b]) setorder(dt1, a) print(
fn1 <- function() {
dt1 <- data.table(a = 1:10, b = 10:1)
setkey(dt1, a)
print(dt1[, b])
fn2(dt1)
print(dt1[, b])
setorder(dt1, a)
print(dt1[, b])
fn3(dt1)
print(dt1[, b])
}
fn2 <- function(dt2) {
keys <- key(dt2)
setkey(dt2, b)
setkeyv(dt2, keys)
}
fn3 <- function(dt2) {
#How do I extract the current ordering of dt2? e.g., ord <- getorder(dt2)
setorder(dt2, b)
#Restore the original ordering of dt2: setorderv(dt2, ord)
}
像这样的事
if(is.unsorted(dt2[,a])){
ord <- "b"
} else {
ord <- "a"
}
if(未排序(dt2[,a])){
ord在数据中有一个未报告的函数。表
被称为是.排序的
,这符合您的要求。当然,不建议依赖未报告的函数,因为它们可能会在未通知的情况下更改。这要求您首先了解可以使用哪些列对表进行排序
data.table:::is.sorted(dt, 'a')
# [1] TRUE
# Warning message:
# In data.table:::is.sorted(dt1, "a") :
# Use 'if (length(o<-forderv(DT,by))) ...' for efficiency in one step, so you have o as well if not sorted.
data.table:::已排序(dt,'a')
#[1]是的
#警告信息:
#在data.table:::is.sorted(dt1,“a”):
#使用'if(length(odt2[,.o:=.I];setorder(dt2,b);setorder(dt2,.o)[,.o:=NULL]
?谢谢你,弗兰克-这真的很巧妙,对我很有用-但这只是因为我目前没有修改数据。fn3()中的表内容。有没有办法提取setorder()中使用的列名/数字,以便fn3()即使fn1()使用的列中的数据更改为order by,它也可以恢复fn1()所期望的顺序?我不希望包装setorder,而是使用setattr()调用来存储传递给setorder/v()的顺序。我不希望使用fn2()的key()/setkey()方法因为我的理解是,它在物理上对行进行重新排序,因此效率低下。我不确定是否会这样做。如果您想将setorder
的参数存储为对象的一个属性,那么实际上您将分叉data.table来创建一个新的对象类..?这超出了我的技能范围。如果这是嵌套函数调用的问题,我会猜测“排序变量”可以作为附加参数与data.table.Fwiw一起传递,setorder和setkey都会对数据进行物理排序;只有setattr
会在不接触核心数据的情况下进行调整。再次感谢Frank。我不知怎的想到setorder()使用了二级索引。鉴于setorder()物理上重新排序,我可以使用setkey/key,这样可以省去很多痛苦。幸运的是,现在我可以使用您的第一个建议,因为fn3没有修改现有数据。祝您好运,Jim。索引
函数可以确认setorder
没有指定二级索引。您可能需要使用e> setindex
如果跟踪这一点很重要。谢谢,simone。这种方法的问题是,在实际应用中,有许多fn1()调用单个fn3,fn3不知道任何特定调用方使用的顺序,因此我无法硬编码fn3以恢复任何特定顺序。可能属性(dt1)$sorted
可能有些用处