如何在函数内部操作R data.tables?

时间:2016-06-05 13:53:59

标签: r data.table

我有一个巨大的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

0 个答案:

没有答案