如何跳过NA';计算R中的时差时为s
我有一个数据框,其中有一个ID列、一个日期列,还有一个列,其中包含处理ID的特定日期。没有在每个日期都处理ID,因此在未处理ID时,“处理日期”列中有NA。我想做的是创建一个新列,其中包含自上次治疗日期起经过的天数如何跳过NA';计算R中的时差时为s,r,date,dplyr,R,Date,Dplyr,我有一个数据框,其中有一个ID列、一个日期列,还有一个列,其中包含处理ID的特定日期。没有在每个日期都处理ID,因此在未处理ID时,“处理日期”列中有NA。我想做的是创建一个新列,其中包含自上次治疗日期起经过的天数 #sample data df1 <- data.frame(ID = c("82002","82002","82002","82002","82002","82002","82002", "82002","82002","82
#sample data
df1 <- data.frame(ID = c("82002","82002","82002","82002","82002","82002","82002",
"82002","82002","82002","82002","82002"),
MtDate = c("2019-07-17","2019-07-17","2019-07-18","2019-07-18","2019-07-18",
"2019-07-19","2019-07-19","2019-07-19","2019-07-21",
"2019-07-21","2019-07-22","2019-07-23"),
TrtDate = c("2019-07-17","NA","2019-07-21", "NA", "NA",
"NA", "NA", "NA", "NA","NA", "NA", "2019-07-23"))
#format MtDate and TrtDate columns as dates
df1$MtDate = ymd(df1$MtDate)
df1$TrtDate = ymd(df1$TrtDate)
我可以手动完成,但我的实际数据包括100000多个积分和200多个不同的治疗日期。
如蒙协助,将不胜感激。
谢谢 我将使用
tidyr::fill
(文档化)在data.frame中填充TrtDate forward的NA值。这将允许您在计算data.frame中感兴趣的数量时有效地“跳过”NA值。我会在原始数据字段的副本上执行此类活动,以便您可以直观地抽查逻辑,并在必要时恢复NA
值
执行此操作的一些代码(加上一些数据清理/规范化):
df1%>%
#转换为日期
dplyr::mutate(TrtDate=lubridate::ymd(dplyr::na_if(TrtDate,“na”)),
MtDate=lubridate::ymd(dplyr::na_if(MtDate,“na”))%%>%
dplyr::分组依据(ID)%>%
#按MtDate排序
dplyr::排列(MtDate)%>%
#创建一份我们将用于填写的TrtDate副本
dplyr::突变(FillTrtDate=TrtDate)%>%
#填补
tidyr::fill(FillTrtDate,.direction='down')%>%
#计算差分
dplyr::mutate(PrevTrtDate=lag(FillTrtDate,default=first(TrtDate),order_by=MtDate),
DaysSincePrevTreat=MtDate-PrevTrDate)%>%
dplyr::ungroup()
结果:
#一个tible:12 x 6
ID MtDate TrtDate FillTrtDate PrevTrtDate DAYSSINCEPREVERTRATE
182002 2019-07-17 2019-07-17 2019-07-17 2019-07-17 0天
2 82002 2019-07-17北美2019-07-17 2019-07-17 0天
3 82002 2019-07-18 2019-07-21 2019-07-21 2019-07-17 1天
4 82002 2019-07-18北美2019-07-21 2019-07-21-3天
5 82002 2019-07-18北美2019-07-21 2019-07-21-3天
6 82002 2019-07-19 NA 2019-07-21 2019-07-21-2天
7 82002 2019-07-19 NA 2019-07-21 2019-07-21-2天
8 82002 2019-07-19 NA 2019-07-21 2019-07-21-2天
9 82002 2019-07-21 NA 2019-07-21 2019-07-21 0天
10 82002 2019-07-21 NA 2019-07-21 2019-07-21 0天
11 82002 2019-07-22 NA 2019-07-21 2019-07-21 1天
12 82002 2019-07-23 2019-07-23 2019-07-23 2019-07-21两天
这个结构清楚地表明,原始示例数据和所需输出中存在一些不一致之处。但上述工具应该可以帮助您解决这些问题
编辑:关于“不一致”的详细信息
提供的数据框架是:
>df1
ID MtDate TrtDate
1 82002 2019-07-17 2019-07-17
182002 2019-07-17北美
3 82002 2019-07-18 2019-07-21
480202 2019-07-18北美
5 82002 2019-07-18北美
6 82002 2019-07-19北美
7 82002 2019-07-19北美
8 82002 2019-07-19北美
9 82002 2019-07-21北美
10 82002 2019-07-21北美
11 82002 2019-07-22北美
12 82002 2019-07-23 2019-07-23
看起来,从您想要的输出来看,第三条记录上有一个打字错误。纠正这一点会产生:
df2-df2
ID MtDate TrtDate
1 82002 2019-07-17 2019-07-17
182002 2019-07-17北美
3 82002 2019-07-18 2019-07-18
480202 2019-07-18北美
5 82002 2019-07-18北美
6 82002 2019-07-19北美
7 82002 2019-07-19北美
8 82002 2019-07-19北美
9 82002 2019-07-21北美
10 82002 2019-07-21北美
11 82002 2019-07-22北美
12 82002 2019-07-23 2019-07-23
为了获得所需的输出,我将如上所述向前填充,但省略lag
步骤:
df2%>%
#转换为日期
dplyr::mutate(TrtDate=lubridate::ymd(dplyr::na_if(TrtDate,“na”)),
MtDate=lubridate::ymd(dplyr::na_if(MtDate,“na”))%%>%
dplyr::分组依据(ID)%>%
#按MtDate排序
dplyr::排列(MtDate)%>%
#创建一份我们将用于填写的TrtDate副本
dplyr::突变(FillTrtDate=TrtDate)%>%
#填补
tidyr::fill(FillTrtDate,.direction='down')%>%
#计算差异,同时转换为日期
dplyr::mutate(DaysSincePrevTreat=MtDate-FillTrtDate)%>%
dplyr::ungroup()
或
#一个tible:12 x 5
ID MtDate TrtDate FillTrtDate DAYSSINCEPREVETREAT
182002 2019-07-17 2019-07-17 2019-07-17 0天
2 82002 2019-07-17北美2019-07-17 0天
3 82002 2019-07-18 2019-07-18 2019-07-18 0天
4 82002 2019-07-18北美2019-07-18 0天
5 82002 2019-07-18北美2019-07-18 0天
6 82002 2019-07-19北美2019-07-18 1天
7 82002 2019-07-19北美2019-07-18 1天
8 82002 2019-07-19北美2019-07-18 1天
9 82002 2019-07-21北美2019-07-18 3天
10 82002 2019-07-21北美2019-07-18 3天
11 82002 2019-07-22北美2019-07-18 4天
12 82002 2019-07-23 2019-07-23 2019-07-23 0天
然后,如果愿意,您可以选择(-FillTrtDate)删除该帮助程序列。我将使用
tidyr::fill
(文档化)在data.frame中向前填充TrtDate的NA值。这将允许您在计算data.frame中感兴趣的数量时有效地“跳过”NA值。我会在原始数据字段的副本上执行这种类型的活动,以便您可以直观地看到sp
df1 <- df1 %>%
arrange(TrtDate) %>%
mutate(DaysSincePrevTreat = TrtDate - lag(TrtDate, default = first(TrtDate)))%>%
data.frame()
> df1
MtDate TrtDate DaysSincePrevTreat
1 2019-07-17 2019-07-17 0 days
2 2019-07-18 2019-07-21 4 days
3 2019-07-23 2019-07-23 2 days
4 2019-07-17 <NA> NA days
5 2019-07-18 <NA> NA days
6 2019-07-18 <NA> NA days
7 2019-07-19 <NA> NA days
8 2019-07-19 <NA> NA days
9 2019-07-19 <NA> NA days
10 2019-07-21 <NA> NA days
11 2019-07-21 <NA> NA days
12 2019-07-22 <NA> NA days
> Desired.Result
ID MtDate TrtDate DaysSincePrevTreat
1 82002 2019-07-17 2019-07-17 0
2 82002 2019-07-17 2019-07-17 0
3 82002 2019-07-18 NA 1
4 82002 2019-07-18 NA 1
5 82002 2019-07-18 NA 1
6 82002 2019-07-19 NA 2
7 82002 2019-07-19 NA 2
8 82002 2019-07-19 NA 2
9 82002 2019-07-21 2019-07-21 0
10 82002 2019-07-21 2019-07-21 0
11 82002 2019-07-22 NA 1
12 82002 2019-07-23 2019-07-23 0