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().
尝试这个:
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