以下是我尝试做的一个例子:
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}}值。有谁知道为什么会这样?
答案 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以提供更多建议。