Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何跳过NA';计算R中的时差时为s_R_Date_Dplyr - Fatal编程技术网

如何跳过NA';计算R中的时差时为s

如何跳过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

我有一个数据框,其中有一个ID列、一个日期列,还有一个列,其中包含处理ID的特定日期。没有在每个日期都处理ID,因此在未处理ID时,“处理日期”列中有NA。我想做的是创建一个新列,其中包含自上次治疗日期起经过的天数

#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