R 我应该使用mget()。。或with=FALSE选择data.table的列?

R 我应该使用mget()。。或with=FALSE选择data.table的列?,r,data.table,R,Data.table,可以使用包含所需列名的变量选择data.table的列,该变量的值为=FALSE,…,mget 在什么时候使用哪种方法有共识吗?是不是有一个数据表比其他的多 我可以提出以下论点: with=FALSE和。。速度几乎相同,而mget则较慢 .. 无法即时选择连接的列名编辑:当前的CRAN版本1.12.8肯定可以,我使用的是旧版本,但它不能,因此此参数有缺陷 mget接近于get的有用语法,get似乎是在j中的计算中使用变量名的唯一方法 至1: 编辑:将.SDcols添加到1中的基准中,b[,cx,

可以使用包含所需列名的变量选择data.table的列,该变量的值为=FALSE,…,mget

在什么时候使用哪种方法有共识吗?是不是有一个数据表比其他的多

我可以提出以下论点:

with=FALSE和。。速度几乎相同,而mget则较慢 .. 无法即时选择连接的列名编辑:当前的CRAN版本1.12.8肯定可以,我使用的是旧版本,但它不能,因此此参数有缺陷 mget接近于get的有用语法,get似乎是在j中的计算中使用变量名的唯一方法 至1:

编辑:将.SDcols添加到1中的基准中,b[,cx,…selected_col]到2

我应该使用mget吗。。或with=FALSE选择data.table的列

你应该使用你喜欢的任何东西,当然,只要它不是不推荐的。我看不到任何实际的用例,当呈现的解决方案之间的性能差异将产生真正的差异时。 有一些参数用于在其他接口上使用with=FALSE,但这些参数与这些接口的维护更相关,而不是真正的用户使用

在最新的data.table版本(从1.14.1开始)中,有一个新功能用于以支持深入参数化data.table查询的方式使用data.table。这个新接口,我们称之为env-arg,可以用来解决您的问题。是的,另一种解决问题的方法。这个env-arg接口更通用,因此在这种简单的用例中,我仍然使用with=FALSE。下面,我为这个新的接口用法添加了verbose=TRUE,以便读者可以看到如何预处理查询以替换变量

b=数据。表X=1L,y=2,z=c 所选列=y b[,cx,所选列,带=假] xy 1: 1 2 b[,.cols,env=list.cols=Icx,selected\u col,verbose=T] 替换后的参数“j”:cx,y xy 1: 1 2 b[,.cols,env=list.cols=as.listcx,selected\u col,verbose=T] 替换后的参数“j”:listx,y xy 1: 1 2 新的env接口也将很好地支持3

b[,sqrt.col,env=list.col=selected\u col,verbose=T] 替换后的参数“j”:sqrty [1] 1.414214
为确保完整性,您可能希望在2个列中包含[,.SD,.SDcols=selected_cols],可以使用:b[,cx,…selected_col],也可以在3个双方括号中使用:b[,sqrt.SD[[selected_col]]或sqrtb[[selected_col]]您始终可以使用以下语言进行计算:evalsubstituteb[,.x,selected_col],listselected\u col=as.nameselected\u colI不打算这样做,特别是。我认为把时间添加到帖子里是个好主意,因为我在努力寻找支持这种方式的论据。我认为这很好地解决了你的问题。如果没有,请提供反馈。非常感谢,我还不知道env,或者在[]内使用verbose是一种可能性。
library(data.table)
library(microbenchmark)

a <- mtcars
setDT(a)

selected_cols <- names(a)[1:4]

microbenchmark(a[, mget(selected_cols)],
               a[, selected_cols, with = FALSE],
               a[, ..selected_cols],
               a[, .SD, .SDcols = selected_cols])

#Unit: microseconds
#                             expr     min       lq     mean   median       uq      max neval cld
#          a[, mget(selected_cols)] 468.483 495.6455 564.2953 504.0035 515.4980 4341.768   100   c
#  a[, selected_cols, with = FALSE] 106.254 118.9385 141.0916 124.6670 130.1820  966.151   100 a  
#              a[, ..selected_cols] 112.532 123.1285 221.6683 129.9050 136.6115 2137.900   100 a  
# a[, .SD, .SDcols = selected_cols] 277.536 287.6915 402.2265 293.1465 301.3990 5231.872   100  b 
b <- data.table(x = rnorm(1e6), 
                y = rnorm(1e6, mean = 2, sd = 4), 
                z = sample(LETTERS, 1e6, replace = TRUE))

selected_col <- "y"

microbenchmark(b[, mget(c("x", selected_col))],
               b[, c("x", selected_col), with = FALSE],
               b[, c("x", ..selected_col)])
# Unit: milliseconds
#                                    expr      min       lq      mean   median       uq      max neval cld
#         b[, mget(c("x", selected_col))] 5.454126 7.160000 21.752385 7.771202 9.301334 147.2055   100   b
# b[, c("x", selected_col), with = FALSE] 2.520474 2.652773  7.764255 2.944302 4.430173 100.3247   100  a 
#             b[, c("x", ..selected_col)] 2.544475 2.724270 14.973681 4.038983 4.634615 218.6010   100  ab
b[, sqrt(get(selected_col))][1:5]
# [1] NaN 1.3553462 0.7544402 1.5791845 1.1007728

b[, sqrt(..selected_col)]
# error

b[, sqrt(selected_col), with = FALSE]
# error