gpt4 book ai didi

r - 当新列值具有不同的类时,data.table 列不会按预期更新

转载 作者:行者123 更新时间:2023-12-04 11:00:09 25 4
gpt4 key购买 nike

当我想更新我在“通过引用”之前创建的列时,我很难理解以下行为。

library(data.table)
#> Warning: package 'data.table' was built under R version 3.6.1
set.seed(2)
mydt <- data.table(group = rep(letters[1:2], each = 5), date1 = as.Date(sample(10), origin = '1970-01-01'), date2 = as.Date(sample(10),origin = '1970-01-01'))

mydt[, diffdates := date1-date2] # creates column "diffdates"

mydt[, whichdate := date1[which.min(abs(date1-date2))], by ='group']
#whichdate is created in order to show what I would expect in the next step

mydt[, diffdates := date1[which.min(abs(date1-date2))], by ='group']
# diffdates is NOT updated in the way I want (should look like "whichdate").

mydt
#> group date1 date2 diffdates whichdate
#> 1: a 1970-01-06 1970-01-02 1 days 1970-01-02
#> 2: a 1970-01-07 1970-01-04 1 days 1970-01-02
#> 3: a 1970-01-10 1970-01-07 1 days 1970-01-02
#> 4: a 1970-01-02 1970-01-03 1 days 1970-01-02
#> 5: a 1970-01-11 1970-01-10 1 days 1970-01-02
#> 6: b 1970-01-08 1970-01-11 3 days 1970-01-04
#> 7: b 1970-01-05 1970-01-08 3 days 1970-01-04
#> 8: b 1970-01-09 1970-01-06 3 days 1970-01-04
#> 9: b 1970-01-04 1970-01-05 3 days 1970-01-04
#> 10: b 1970-01-03 1970-01-09 3 days 1970-01-04

事实上,有些事情正在发生,但并不完全是预期的结果。 (我希望更新的列与我的“哪个日期”列相同)。
我不明白的是它使用简单的函数工作,例如:
mtcars_dt <- as.data.table(mtcars)

mtcars_dt[, max_mpg := min(mpg), by = 'cyl']

mtcars_dt[, max_mpg := max(mpg), by = 'cyl'] #properly updates the previous column

head(mtcars_dt)
#> mpg cyl disp hp drat wt qsec vs am gear carb max_mpg
#> 1: 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4 21.4
#> 2: 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4 21.4
#> 3: 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1 33.9
#> 4: 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1 21.4
#> 5: 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2 19.2
#> 6: 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1 21.4

创建于 2019-11-14 由 reprex package (v0.3.0)

最佳答案

这是因为 data.table 在列创建后维护了列的类。如果您尝试用不同类的新向量替换现有列,它将转换为原始类或给出错误。这里diffdates是一个 difftime-classed 对象,你试图用 date-classed 对象替换它。

一种解决方案是删除该列,然后将其重新添加,如下所示。

mydt[, diffdates := NULL]
mydt[, diffdates := date1[which.min(abs(date1-date2))], by ='group']

根据上面@Henrik 的评论添加到这一点,另一种将列更改为新类的方法是提供长度为 nrow(dt) 的向量。在 := 的右侧.注意:即使分组中的长度加起来为 nrow(dt)这不起作用,你必须给出一个长度为 nrow(dt) 的向量(因此,这种更改类的方法在使用 by 时不起作用)

例子:
d <- data.table(a = rep(1:2, 2), b = 1:4)

d[, b := rep(Sys.Date(), .N), by = a][]
# a b
# 1: 1 18214
# 2: 2 18214
# 3: 1 18214
# 4: 2 18214
d[, b := Sys.Date()][]
# a b
# 1: 1 18214
# 2: 2 18214
# 3: 1 18214
# 4: 2 18214
d[, b := rep(Sys.Date(), .N)][]
# a b
# 1: 1 2019-11-14
# 2: 2 2019-11-14
# 3: 1 2019-11-14
# 4: 2 2019-11-14

关于r - 当新列值具有不同的类时,data.table 列不会按预期更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58858955/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com