我有一个名为t_compl
的df,其中包含三列日期。
date_op_indl date_compl usdato.x
1984-11-22 1984-11-22 1983-09-07
2004-11-16 NA 1994-10-27
1996-09-10 1996-09-10 1982-11-09
1986-05-24 1986-05-24 1982-11-22
1989-08-22 1989-06-13 1983-02-11
我想创建第四个变量(t_compl$time
),其中年份的usdato.x
和date_compl
或date_op_indl
之间存在时差。我想从date_compl
和date_op_indl
选择最早的日期。
我试过了
t_compl$time<- ifelse((t_compl$date_compl-t_compl$usdato.x)<=(t_compl$date_op_indl-t_compl$usdato.x), ((t_compl$date_compl-t_compl$usdato.x)/365.25), ((t_compl$date_op_indl-t_compl$usdato.x)/365.25))
由于缺少某些date_compl
,我想使用compl_op_indl
进行计算
t_compl$time[is.na(t_compl$time)] <- ((t_compl$date_op_indl-t_compl$usdato.x)/365.25)
然后出现此错误
Warning message:
In t_compl$time[is.na(t_compl$time)] <- ((t_compl$date_op_indl - :
number of items to replace is not a multiple of replacement length
compl_date
NA
的时间计算也完全错误。
如何在R?
中进行时差计算答案 0 :(得分:1)
DF <- read.table(text="date_op_indl date_compl usdato.x
1984-11-22 1984-11-22 1983-09-07
2004-11-16 NA 1994-10-27
1996-09-10 1996-09-10 1982-11-09
1986-05-24 1986-05-24 1982-11-22
1989-08-22 1989-06-13 1983-02-11", header=TRUE)
DF[] <- lapply(DF, as.Date)
使用pmin
计算每次观察的最短日期(从而忽略NA
值):
DF$time <- difftime(do.call(pmin, c(DF[, c("date_op_indl", "date_compl")], na.rm = TRUE)),
DF$usdato.x, units="days")
# date_op_indl date_compl usdato.x time
# 1 1984-11-22 1984-11-22 1983-09-07 442 days
# 2 2004-11-16 <NA> 1994-10-27 3673 days
# 3 1996-09-10 1996-09-10 1982-11-09 5054 days
# 4 1986-05-24 1986-05-24 1982-11-22 1279 days
# 5 1989-08-22 1989-06-13 1983-02-11 2314 days
答案 1 :(得分:1)
这是另一种方法。我将角色转换为日期然后计算时差。既然你说你将使用年份作为单位,我在/365
中有mutate
。
library(dplyr)
mydf %>%
mutate_each(funs(as.Date(.))) %>%
mutate(time = ifelse(date_compl %in% NA, (date_op_indl - usdato.x) / 365,
(date_compl - usdato.x) / 365))
# date_op_indl date_compl usdato.x time
#1 1984-11-22 1984-11-22 1983-09-07 1.210959
#2 2004-11-16 <NA> 1994-10-27 10.063014
#3 1996-09-10 1996-09-10 1982-11-09 13.846575
#4 1986-05-24 1986-05-24 1982-11-22 3.504110
#5 1989-08-22 1989-06-13 1983-02-11 6.339726