【问题标题】:How to wrap "descending sort in data table" into a function?如何将“数据表中的降序排序”包装到函数中?
【发布时间】:2013-11-12 12:46:28
【问题描述】:

看到Sort a data.table fast by Ascending/Descending order之后

我想包装任何一个

X <- X[order(Year, MemberID, -Month)]

X[,Month:=-Month]
setkey(X,Year,MemberID,Month)
X[,Month:=-Month]

进入一个函数,比如d.setkey(data, key)

但是,order:= rhs 似乎只接受列名而不是字符,我不知道如何传递参数?

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    你可以使用get:

    DT[, "Month" := -get("Month"),with=TRUE]
    

    或者:

    DT[,`:=`("Month"=-get("Month"))]
    

    或者更一般的使用表达式:

    expr <- substitute(x := -x,  list(x=as.name("Month")))
    DT[,eval(expr)]
    

    【讨论】:

    • 为什么我不能使用DT[,Month:=-as.name("Month")]
    • 因为你不能做-as.name("Month")。 (此处与data.table无关)
    • 你也可以在 1.8.11 中使用DT[, "Month" := -eval(as.name("Month"))](这比get 效率更高,因为后者从DT 构造all 列)
    • @eddi “构造所有列”是什么意思?你能详细说明一下吗?
    • @colinfang data.table 通常会尝试理解 j 表达式并找出使用了哪些列,并且仅在内部填充这些列以进行进一步的操作,例如分组(我实际上不是 100%确保它在没有 by 时会这样做)。不幸的是,在使用get.SD 的那一刻,逻辑就消失了,这就是为什么如果考虑速度,通常应该避免这些逻辑。实际上,我今天添加了一个 FR,​​以在内部替换 get。
    猜你喜欢
    • 1970-01-01
    • 2016-02-21
    • 1970-01-01
    • 2017-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-02
    • 1970-01-01
    相关资源
    最近更新 更多