Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.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_Data.table - Fatal编程技术网

对于R data.table,如何确定当前的顺序

对于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(

我正在为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(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(o
dt2[,.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
可能有些用处