【问题标题】:Adding a column in data.table with = vs := [duplicate]在 data.table 中添加一列 = vs := [重复]
【发布时间】:2018-11-25 18:00:20
【问题描述】:

我尝试使用两种方法在 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有不同的结果?它们之间有两个区别:

  1. 方式 2 的列多于方式 1;
  2. 方式 2 的行除了 0 和 1 之外还有 Grps。

【问题讨论】:

  • 请提供一个可重现的例子
  • 使用方式 1,您不是向表中添加列,而是 (1) 过滤它并 (2) 聚合它,创建一个新表。使用方式 2,您将向表的过滤部分添加一列(不符合过滤器的部分填充 NA)。您应该完成教程; data.table 为此附带了小插图。

标签: r data.table assignment-operator colon-equals


【解决方案1】:

= 用于聚合/汇总,结果的行数与 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 年 6 月 16 日创建。

【讨论】:

  • 我明白了,谢谢你,休!
猜你喜欢
  • 1970-01-01
  • 2020-04-16
  • 2019-01-28
  • 1970-01-01
  • 2017-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-06
相关资源
最近更新 更多