如何使用lubridate包计算两个日期向量之间的月数,其中一个向量具有NA值?

如何使用lubridate包计算两个日期向量之间的月数,其中一个向量具有NA值?,r,R,我已经阅读了lubridate软件包手册,对堆栈溢出提出了各种各样的问题,但没有找到具体问题的答案 我想做的是计算事件发生时的年龄,以月为单位,作为出生日期和特定事件日期之间的差值 因此,我使用sas7bdat包导入了一个SAS数据集,并使用以下代码将我的SAS日期变量(DOB和Event)转换为R对象: df$DOB <- as.Date(df$DOB, origin="1960-01-01") df$DOB1 <- ymd(df$DOB) df$DOB代替 df$Age1 &l

我已经阅读了lubridate软件包手册,对堆栈溢出提出了各种各样的问题,但没有找到具体问题的答案

我想做的是计算事件发生时的年龄,以月为单位,作为出生日期和特定事件日期之间的差值

因此,我使用
sas7bdat
包导入了一个SAS数据集,并使用以下代码将我的SAS日期变量(DOB和Event)转换为R对象:

df$DOB <- as.Date(df$DOB, origin="1960-01-01")
df$DOB1 <- ymd(df$DOB)
df$DOB代替

df$Age1 <- df$interval %/% months(1)

df$Age1所以我把这个答案归功于我的天才同事。我忽略了包含一个可复制的示例,因为每当我编写问题的简单近似值时,
df$Age1这里是lubridate(1.3.3)报告问题的另一个示例。请注意,根据数据集中的其他内容,可能会有不同的错误消息,而问题似乎取决于度量单位(在我的情况下,月份工作,而年份没有)


dat使用lubridate包的简单示例

library(lubridate)
date1='20160101'
date2='20160501'
x=interval(ymd(date1),ymd(date2))
x= x %/% months(1)
print(x)
# answer : 4
或如下所示:

x=as.period(x) %>% month()
print(x)
# answer : 4

如果您使用DOBs创建了df,那么您的代码将是可复制的,并且我们可以尝试更容易地找到错误。照目前的情况,我无法重现这个错误。当我做
new\u interval(NA,“1962-01-01”)%%/%months(1)
时,我只得到
NA
。让你的例子重现。
%%/
做什么?这是lubridate软件包的一部分吗?
%%/
似乎只是四舍五入到最接近的整数?它与
楼层(x/月(1))有什么不同吗
?然后是我真正的问题,你能做
上限(x/months(x))
来获得汇总行为吗?如果间隔时间>12个月,第二种解决方案可能会导致错误答案。基本上,它将把它读为
'y'年,'m'月…
并返回
m月
,而正确的答案应该是
y*12+m
。您也可以使用
as.integer(ymd(date2)-ymd(date1))
来获取两个日期之间的天数。
df$Age1 <- df$interval %/% months(1)
df$Age1 <- NA
df$Age1[!is.na(df$DOB)] <- df$interval[!is.na(df$DOB)] %/% months(1)
df$Age1 = rep(NA, nrow(df))
for (i in 1:nrow(df)) {
   df$Age1[i]<- df$interval[i] %/% months(1)
                      }
df$Age1[1:15]
> df$interval[13]
[1] 1995-10-31 19:00:00 EST--1996-05-26 20:00:00 EDT
df$Age1<- as.period(df$interval)
head(df$Age1)

[1] "1y 2m 26d 0H 0M 0S" "6m 15d 23H 0M 0S"  
[3] "4m 9d 23H 0M 0S"    "3m 19d 23H 0M 0S"  
[5] "3y 0m 25d 0H 0M 0S" "1y 1m 29d 1H 0M 0S"

df$Age1 <- df$Age1 %/% months(1)
head(df$Age1)

[1] 14  6  4  3 36 13
dat <- as.data.frame(list(Start = as.Date(c("1942-08-09", "1956-02-29")),
                          End   = as.Date(c("2007-07-31", "2007-09-13"))))

int0 <- with(dat, new_interval(Start, End))
as.period(int0, unit = "years")
"Error in est[start + est * per > end] <- est[start + est * per > end] -  : 
  NAs are not allowed in subscripted assignments"

int1 <- with(dat[1,], new_interval(Start, End))
as.period(int1, unit = "years")
[1] "64y 11m 22d 0H 0M 0S"

int2 <- with(dat[2,], new_interval(Start, End))
as.period(int2, unit = "years")
"Error in while (any(start + est * per > end)) est[start + est * per >  : 
  missing value where TRUE/FALSE needed"

as.period(int0) %/% years(1)
[1] 64 51

as.period(int0, unit = "months")
[1] "779m 22d 0H 0M 0S" "618m 15d 0H 0M 0S"
library(lubridate)
date1='20160101'
date2='20160501'
x=interval(ymd(date1),ymd(date2))
x= x %/% months(1)
print(x)
# answer : 4
x=as.period(x) %>% month()
print(x)
# answer : 4