为什么两个 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只把.Data
slot设置为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的了解还不够多,无法提供更多建议。
这是我正在尝试做的一个例子:
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只把.Data
slot设置为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的了解还不够多,无法提供更多建议。