gpt4 book ai didi

r - data.table 中的区间类

转载 作者:行者123 更新时间:2023-12-04 12:37:57 24 4
gpt4 key购买 nike

我的问题将在以下可重现的示例中得到解释。

首先,让我们加载所需的包并创建一个 POSIXct和一个 data.table目的。

library(data.table)
library(lubridate)

target_date <- ymd(20180601, tz='America/Montreal')

test <- data.table(
V1 = seq(1:3),
V2 = c(ymd(20170421, tz='America/Montreal'),
ymd(20170702, tz='America/Montreal'),
ymd(20180113, tz='America/Montreal'))
)

正如我们在下面看到的,一切正常。
test[]

## V1 V2
## 1: 1 2017-04-21
## 2: 2 2017-07-02
## 3: 3 2018-01-13

然后,我创建一个包含 Interval 的新列。对象。
test[, V3:=interval(V2, target_date)]

还在那里,一切都很好。
test[]

## V1 V2 V3
## 1: 1 2017-04-21 2017-04-21 EDT--2018-06-01 EDT
## 2: 2 2017-07-02 2017-07-02 EDT--2018-06-01 EDT
## 3: 3 2018-01-13 2018-01-13 EST--2018-06-01 EDT

然后,我想创建两个仅在前两行上定义的新列:第一个是 POSIXct 的函数。列和第二个是 Interval 的函数柱子。
test[c(1, 3), V4 := V2 + days(20)]
test[]

## V1 V2 V3 V4
## 1: 1 2017-04-21 2017-04-21 EDT--2018-06-01 EDT 2017-05-11
## 2: 2 2017-07-02 2017-07-02 EDT--2018-06-01 EDT <NA>
## 3: 3 2018-01-13 2018-01-13 EST--2018-06-01 EDT 2018-02-02

在这一点上仍然是正确的。

然后,当我用 Interval 的列函数尝试同样的事情时列,我得到以下 warning
test[c(1, 3), V5 := ymd(20180101, tz='America/Montreal') %within% V3]

## Warning messages:
## 1: In as.numeric(a) - as.numeric(b@start) <= b@.Data :
## longer object length is not a multiple of shorter object length
## 2: In `[.data.table`(test, c(1, 3), `:=`(V5, ymd(20180101, tz = "America/Montreal") %within% :
## Supplied 3 items to be assigned to 2 items of column 'V5' (1 unused)

warning告诉我,事实上,该命令产生了 3 个值,我尝试在 2 行中输入这些值 data.table (过滤后的 data.table 有两行)。

我试图找出问题所在,我想我找到了一个提示。考虑以下两个命令:
test[, V3][2]
## [1] 2017-07-02 EDT--2018-06-01 EDT

test[2, V3]
## [1] 2017-04-21 EDT--2018-03-21 EDT 2017-07-02 EDT--2018-06-01 EDT 2018-01-13 EST--2018-12-13 EST

事实上,我认为这两个命令会产生相同的结果,但事实并非如此。更令人惊讶的是,他们都有一个 length 1(在查看上面的输出时,我认为第二个命令的 length 为 3)。
length(test[, V3][2])
## [1] 1

length(test[2, V3])
## [1] 1

问题是,这两个命令在 .Data 中生成一个向量为 1 的对象。插槽(我猜 Interval 的长度以秒为单位),
test[, V3][2]@.Data
## [1] 28857600

test[2, V3]@.Data
## [1] 28857600

但第一个在 start 中的向量为 1插槽,而第二个在 start 中的向量为 3投币口。
test[, V3][2]@start
## [1] "2017-07-02 EDT"

test[2, V3]@start
## [1] "2017-04-21 EDT" "2017-07-02 EDT" "2018-01-13 EST"

我知道我可以通过封装每个 Interval 来解决这个问题。列表中的对象并在我每次需要时提取它们,但是还有另一种方法来处理这个问题吗?

最佳答案

可能有点脏,但你能不能去:

test[c(1, 3), V5 := ymd(20180101, tz='America/Montreal') %within% V3[.I]]

test[, dat := (V3[.I]@.Data)]

关于r - data.table 中的区间类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48571432/

24 4 0