通过函数做绝对降序的data.table?

mic*_*str 5 sorting r data.table

我想通过将sort.field传递给函数来进行绝对降序排序(即排序忽略符号,例如5,data.table-2,1).

我看过降序排序,但在我的努力中我得到错误或者我正在改变变量的符号,而不是正确排序.

这有效:

library(data.table)
DT <- data.table(id = c("a","b","z"), 
                 score = c(1, 5, -2))
DT1 <- copy(DT)

#doing sort direct works
DT1 <- DT1[order(-abs(score))] 
# i.e. b, Z, a
Run Code Online (Sandbox Code Playgroud)

但是当传递参数时,我找不到正确的语法(数学错误,必须提供j,等等)

#in function
sort.field = "score"

sortme <- function(dt, sort.field){

  dt <- dt[order(-abs(sort.field))]  
}

DT2 <- sortme(DT, sort.field)
#  ERROR get non-numeric argument to maths function as it sees string
Run Code Online (Sandbox Code Playgroud)

我尝试了各种各样的evals,as.name,= F等.

   dt <- dt[, order(-abs(as.name(sort.field))]  

   # even
    expr <- substitute(x := -abs(x),  list(x=as.name(sort.field)))
    dt<- dt[,eval(expr)]

DT3 <- DT[,eval(expr)] # changes all to negative
DT4 <- DT[order(eval(expr))] # DT not happy
Run Code Online (Sandbox Code Playgroud)

请把我从痛苦中解救出来!非常感谢.

PS setorderv()处理直升序和降序.是的,我可以添加一个列,绝对它然后使用setorderv,然后删除临时列,但我正在寻找一个更优雅的解决方案.

编辑:其他人指出过滤的类似答案.该问题还涉及data.frames,而不仅仅是数据表,并专注于过滤数据行.它不使用类似于abs()字段文本的函数进行变换排序,保留所有行而不更改数据.另外这个问题可以帮助其他人在看这个绝对排序类型data.table不覆盖在它的setorderv().

Col*_*vel 3

尝试这个:

sort.field = "score"

sortme <- function(dt, sort.field) dt[order(-abs(dt[[sort.field]]))]

sortme(DT, sort.field)
#   id score
#1:  b     5
#2:  z    -2
#3:  a     1
Run Code Online (Sandbox Code Playgroud)

在第一个函数定义之后您所做的是将一个字符串传递给该abs函数,因此ERROR get non-numeric argument to maths function as it sees string