7.5 小技巧
7.5.1 用{}抑制中间过程输出
默认只返回未命名花括号中定义的最后一个对象。
<- data.table(mtcars)
dt =mean(mpg); tmp2=mean(abs(mpg-tmp1)); tmp3=round(tmp2, 2)}, by=cyl]
dt[,{tmp1#> cyl V1
#> 1: 6 1.19
#> 2: 4 3.83
#> 3: 8 1.79
在我不知道上述技巧之前,我可能的操作是
<- data.table(mtcars)
dt <- dt[,tmp1:=mean(mpg), by=cyl][,.(tmp2=mean(abs(mpg-tmp1))), by=.(cyl)]
res round(tmp2,2)),by=.(cyl)][]
res[,.(#> cyl V1
#> 1: 6 1.19
#> 2: 4 3.83
#> 3: 8 1.79
保留中间变量
=mean(mpg); tmp2=mean(abs(mpg-tmp1)); tmp3=round(tmp2, 2); list(tmp2=tmp2, tmp3=tmp3)}, by=cyl][]
dt[,{tmp1#> cyl tmp2 tmp3
#> 1: 6 1.19 1.19
#> 2: 4 3.83 3.83
#> 3: 8 1.79 1.79
不写分号的方式
=mean(mpg)
dt[,{tmp1=mean(abs(mpg-tmp1))
tmp2=round(tmp2, 2)
tmp3list(tmp2=tmp2, tmp3=tmp3)},
=cyl][]
by#> cyl tmp2 tmp3
#> 1: 6 1.19 1.19
#> 2: 4 3.83 3.83
#> 3: 8 1.79 1.79
7.5.2 使用[]打印data.table
在测试代码查看结果时很有用。
<- head(mtcars) # doesn't print
df <- head(mtcars)) # does print
(df #> # A tibble: 6 x 11
#> mpg cyl disp hp drat wt qsec vs am gear carb
#> <dbl> <int> <dbl> <int> <dbl> <dbl> <dbl> <int> <int> <int> <int>
#> 1 21 6 160 110 3.9 2.62 16.5 0 1 4 4
#> 2 21 6 160 110 3.9 2.88 17.0 0 1 4 4
#> 3 22.8 4 108 93 3.85 2.32 18.6 1 1 4 1
#> 4 21.4 6 258 110 3.08 3.22 19.4 1 0 3 1
#> 5 18.7 8 360 175 3.15 3.44 17.0 0 0 3 2
#> 6 18.1 6 225 105 2.76 3.46 20.2 1 0 3 1
# data.table way of printing after an assignment
<- data.table(head(mtcars)) # doesn't print
dt :=hp/wt][] # does print
dt[,hp2wt#> mpg cyl disp hp drat wt qsec vs am gear carb hp2wt
#> 1: 21.0 6 160 110 3.90 2.62 16.5 0 1 4 4 42.0
#> 2: 21.0 6 160 110 3.90 2.88 17.0 0 1 4 4 38.3
#> 3: 22.8 4 108 93 3.85 2.32 18.6 1 1 4 1 40.1
#> 4: 21.4 6 258 110 3.08 3.21 19.4 1 0 3 1 34.2
#> 5: 18.7 8 360 175 3.15 3.44 17.0 0 0 3 2 50.9
#> 6: 18.1 6 225 105 2.76 3.46 20.2 1 0 3 1 30.3