如何使用lubridate包计算两个日期向量之间的月数,其中一个向量具有NA值?
我已经阅读了lubridate软件包手册,对堆栈溢出提出了各种各样的问题,但没有找到具体问题的答案 我想做的是计算事件发生时的年龄,以月为单位,作为出生日期和特定事件日期之间的差值 因此,我使用如何使用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
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