[英]For an R data.table, how do I determine the current ordering
我正在寻找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"
}
查看?is.unsorted()
data.table
有一个未导出的函数,称为is.sorted
,可以完成您想要的操作。 当然,不建议依赖未导出的函数,因为它们可以在不通知的情况下进行更改。 它要求您首先了解可以使用哪些列对表进行排序。
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:::is.sorted(DT,by)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.