在data.table中,我希望使用by =进行子集化,然后访问包含相应列向量的环境。但是,它看起来并没有正常工作。
> mtcars
mpg cyl disp hp drat wt qsec vs am gear carb
1: 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
2: 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
3: 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
4: 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
5: 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
.
.
.
> mtcars <- data.table(mtcars)
> f<-function(e=parent.frame()) {print(ls(e)); 1}
> mtcars[, f(), by=gear]
[1] "Cfastmean" "gear" "mean" "print"
[1] "Cfastmean" "gear" "mean" "print"
[1] "Cfastmean" "gear" "mean" "print"
gear V1
1: 4 1
2: 3 1
3: 5 1
我希望print(ls(e))
调用会打印出mpg,cyl,disp,hp等等。但它并没有。这里是否有错误或者这不是data.table应该如何工作的?
答案 0 :(得分:2)
data.table
的效率技巧之一是仅将这些列放在实际使用的环境中,并且您只使用gear
列。
与:比较:
mtcars[, {.SD; f()}, by = gear]
# [1] "am" "carb" "Cfastmean" "cyl" "disp" "drat" "gear"
# "hp" "mean" "mpg"
# [11] "print" "qsec" "vs" "wt"
# ...
所有列都在环境中,因为我使用了.SD
。