为什么两个带有lubridate区间变量的data.frames的一对多合并产生NA的区间?

时间:2015-11-17 15:25:58

标签: r lubridate

以下是我尝试做的一个例子:

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结束的时间间隔,当我预料到它刚刚创建时{ {1}}值。有谁知道为什么会这样?

1 个答案:

答案 0 :(得分:2)

检查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对象。表只将.Data插槽设置为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以提供更多建议。