使用 = vs := 在 data.table 中添加一列
Adding a column in data.table with = vs :=
我尝试使用两种方法在 data.table 中添加一列,但返回了不同的结果。但是我不明白为什么,请你给我一个提示?
方式一:
avg_tvd <- dev_survey4[Grp==0 | Grp==1, .(avgTVD = mean(TVDmASL, na.rm=TRUE)),
by = .(Grp,WELL,APA_Pair_ID)]
结果如下:
方式二:
avg_tvd <- dev_survey4[Grp==0 | Grp==1, avgTVD := mean(TVDmASL, na.rm=TRUE),
by = .(Grp,WELL,APA_Pair_ID)]
结果如下:
方式1的结果就是我想要的。但是为什么方式2有不同的结果呢?它们之间有两个区别:
- 方式2的列多于方式1;
- 第 2 行除了 0 和 1 之外还有 Grps。
=
对于 aggregating/summarising,结果的行数与 by
中唯一值的数量相同
:=
添加一列,结果与原来的行数相同
例如:
library(data.table)
dt <- data.table(I = 1:3, x = 11:13, y = c("A", "A", "B"))
dt[, .(mx = mean(x)), by = "y"]
#> y mx
#> 1: A 11.5
#> 2: B 13.0
dt[, mx := mean(x), by = "y"][]
#> I x y mx
#> 1: 1 11 A 11.5
#> 2: 2 12 A 11.5
#> 3: 3 13 B 13.0
由 reprex package (v0.2.0) 创建于 2018-06-16。
我尝试使用两种方法在 data.table 中添加一列,但返回了不同的结果。但是我不明白为什么,请你给我一个提示? 方式一:
avg_tvd <- dev_survey4[Grp==0 | Grp==1, .(avgTVD = mean(TVDmASL, na.rm=TRUE)),
by = .(Grp,WELL,APA_Pair_ID)]
结果如下:
方式二:
avg_tvd <- dev_survey4[Grp==0 | Grp==1, avgTVD := mean(TVDmASL, na.rm=TRUE),
by = .(Grp,WELL,APA_Pair_ID)]
结果如下:
方式1的结果就是我想要的。但是为什么方式2有不同的结果呢?它们之间有两个区别:
- 方式2的列多于方式1;
- 第 2 行除了 0 和 1 之外还有 Grps。
=
对于 aggregating/summarising,结果的行数与 by
:=
添加一列,结果与原来的行数相同
例如:
library(data.table)
dt <- data.table(I = 1:3, x = 11:13, y = c("A", "A", "B"))
dt[, .(mx = mean(x)), by = "y"]
#> y mx
#> 1: A 11.5
#> 2: B 13.0
dt[, mx := mean(x), by = "y"][]
#> I x y mx
#> 1: 1 11 A 11.5
#> 2: 2 12 A 11.5
#> 3: 3 13 B 13.0
由 reprex package (v0.2.0) 创建于 2018-06-16。