为什么两个 data.frames 与 lubridate 间隔变量的一对多合并会产生具有 NA 的间隔?

Why does a one-to-many merge of two data.frames with a lubridate interval variable produce intervals with NA?

这是我正在尝试做的一个例子:

library(lubridate)

(df1 <- data.frame(id1 = 1:5, id2 = c(NA, NA, 2, 2, 3)))
#   id1 id2
# 1   1  NA
# 2   2  NA
# 3   3   2
# 4   4   2
# 5   5   3

(df2 <- data.frame(id3 = 2, time = interval(today() - years(1), today())))
#   id3                                             time
# 1   2 2014-11-16 19:00:00 EST--2015-11-16 19:00:00 EST

merge(x = df1, y = df2, by.x = "id2", by.y = "id3", all.x = TRUE, all.y = FALSE)
#   id2 id1                                             time
# 1   2   3 2014-11-16 19:00:00 EST--2015-11-16 19:00:00 EST
# 2   2   4 2014-11-16 19:00:00 EST--2015-11-16 19:00:00 EST
# 3   3   5                      2014-11-16 19:00:00 EST--NA
# 4  NA   1                      2014-11-16 19:00:00 EST--NA
# 5  NA   2                      2014-11-16 19:00:00 EST--NA

我预计会得到:

#   id2 id1                                             time
# 1   2   3 2014-11-16 19:00:00 EST--2015-11-16 19:00:00 EST
# 2   2   4 2014-11-16 19:00:00 EST--2015-11-16 19:00:00 EST
# 3   3   5                                               NA
# 4  NA   1                                               NA
# 5  NA   2                                               NA

因此,在这个一对多合并中,lubridate 创建了从 today() - years(1) 开始到 NA 结束的间隔,而我本以为它只会创建了 NA 个值。有谁知道为什么会这样?

检查 interval 对象:

str(x <- interval(today() - years(1), today()))
#Formal class 'Interval' [package "lubridate"] with 3 slots
#  ..@ .Data: num 31536000
#  ..@ start: POSIXct[1:1], format: "2014-11-17 01:00:00"
#  ..@ tzone: chr ""

是一个S4对象,有3个slot,data.table只把.Dataslot设置为NA,类似这样:

is.na(x) <- TRUE
str(x)
#Formal class 'Interval' [package "lubridate"] with 3 slots
#  ..@ .Data: num NA
#  ..@ start: POSIXct[1:1], format: "2014-11-17 01:00:00"
#  ..@ tzone: chr ""

我不确定 data.table 怎么知道您希望开始也是 NA。也许可以定义一些函数的一些方法,但我对S4的了解还不够多,无法提供更多建议。