我有一个巨大的DT,我想创建一个按列变量命令的函数。
以下内容:
set.seed(1)
DT <- data.table(col.a = 1:5, col.b = rev(11:15), col.c = rnorm(5))
order.by.col.b <- function(my.datatable){
my.datatable <- my.datatable[order(col.b)]
# my.datatable <- setDT(my.datatable)[order(col.b)]
return(my.datatable)
}
确实有效:
order.by.col.b(my.datatable = DT)
# col.a col.b col.c
# 1: 5 11 0.3295078
# 2: 4 12 1.5952808
# 3: 3 13 -0.8356286
# 4: 2 14 0.1836433
# 5: 1 15 -0.6264538
但最终它不会改变DT
:
DT
# col.a col.b col.c
# 1: 1 15 -0.6264538
# 2: 2 14 0.1836433
# 3: 3 13 -0.8356286
# 4: 4 12 1.5952808
# 5: 5 11 0.3295078
只有在我将其分配给DT
时才会更改订单:
DT <- order.by.col.b(my.datatable = DT)
DT
# col.a col.b col.c
# 1: 5 11 0.3295078
# 2: 4 12 1.5952808
# 3: 3 13 -0.8356286
# 4: 2 14 0.1836433
# 5: 1 15 -0.6264538
DT
很大,所以我想避免不必要的副本。
<-
是唯一可行的方法,还是有更紧凑/正确的方法来处理函数内部的data.tables?
此外,我希望函数order.by.col.b
对提供的DT
执行多项操作,例如创建新列,进行计算等...
修改
我想我得到了它thanks to Arun。如果有更合适的方法,请说明。
set.seed(1)
DT <- data.table(col.a = 1:5, col.b = rev(11:15), col.c = rnorm(5))
order.by.col.b.and.create.col.d <- function(my.datatable){
setorder(my.datatable, col.b)
setDT(my.datatable)[, col.d := col.b + col.c]
}
DT
# col.a col.b col.c
# 1: 1 15 -0.6264538
# 2: 2 14 0.1836433
# 3: 3 13 -0.8356286
# 4: 4 12 1.5952808
# 5: 5 11 0.3295078
order.by.col.b.and.create.col.d(my.datatable = DT)
DT
# col.a col.b col.c col.d
# 1: 5 11 0.3295078 11.32951
# 2: 4 12 1.5952808 13.59528
# 3: 3 13 -0.8356286 12.16437
# 4: 2 14 0.1836433 14.18364
# 5: 1 15 -0.6264538 14.37355