我想检查某个日期间隔或不适用的观测值,然后创建新变量。参见示例:
d <- wrapr::build_frame( "ID", "DATE1", "DATE2" | 1 , "2001-03-05" , "2001-01-05" | 2 , "2001-01-02" , "NA" | 3 , "2001-01-02" , "2004-04-01" | 4 , "2012-01-02" , "2012-01-02" )
生成此:
ID DATE1 DATE2
1 1 2001-03-05 2001-01-05
2 2 2001-01-02 NA
3 3 2001-01-02 2004-04-01
4 4 2012-01-02 2012-01-02
而且我希望结果像这样:
ID DATE1 DATE2 VAR
1 1 2001-03-05 2001-01-05 2001-01-05
2 2 2001-01-02 NA 0
3 3 2001-01-02 2004-04-01 0
4 4 2012-01-02 2012-01-02 2012-01-02
即DATE1
应该大于或等于DATE2
,但不超过90天。
如果为真,则应将DATE2
写入新列VAR
。
如果不正确或DATE2
为NA,则VAR
应为0。
我一直在尝试使用dplyr
,但无法真正解决该问题。
d<-d%>%group_by(ID)%>%filter(is.na(DATE2)|((DATE1-DATE2)>0)
d<-d%>%group_by(ID)%>%filter(is.na(DATE2)|((DATE1-DATE2)<90)
最好,H
使用dplyr
和tidyr
的一种可能的解决方案是
library(dplyr)
library(tidyr)
d %>%
mutate(
DATE1 = as.Date(DATE1),
DATE2 = as.Date(DATE2),
VAR = ifelse(DATE1 >= DATE2 & as.numeric(difftime(DATE1, DATE2, units = "days")) < 90, as.character(DATE2), 0)
) %>%
replace_na(list(VAR = 0))
输出
# ID DATE1 DATE2 VAR
# 1 1 2001-03-05 2001-01-05 2001-01-05
# 2 2 2001-01-02 <NA> 0
# 3 3 2001-01-02 2004-04-01 0
# 4 4 2012-01-02 2012-01-02 2012-01-02