在data.table
中将get
与.SDcols
结合使用时,我遇到了以下令人费解(对我而言)的行为:列顺序未保留,如:
mtcarsDT <- setDT(copy(mtcars))
vars <- c( "disp", "hp", "mpg")
fun <- "median"
mtcarsDT[, lapply(.SD, median), .SDcols = vars]
# disp hp mpg
# 1: 196.3 123 19.2
mtcarsDT[, lapply(.SD, get(fun)), .SDcols = vars]
# mpg disp hp
# 1: 19.2 196.3 123
请注意,如果没有.SDcols
,则不会发生这种情况:
mtcarsDT[, lapply(.SD, median)]
# mpg cyl disp hp drat wt qsec vs am gear carb
# 1: 19.2 6 196.3 123 3.695 3.325 17.71 0 0 4 2
mtcarsDT[, lapply(.SD, get(fun))]
# mpg cyl disp hp drat wt qsec vs am gear carb
# 1: 19.2 6 196.3 123 3.695 3.325 17.71 0 0 4 2
我想知道是否有人可以阐明这种行为:这是一个错误还是一个功能?在后一种情况下,我如何推断列出现的顺序?
最终,我想根据原始变量名称命名新列,调用如下:
newVars <- paste0(vars, "_median")
mtcarsDT[, (newVars) := lapply(.SD, get(fun)), .SDcols = vars]
现在产生不正确的结果。