如何在R中填写下一个和上一个日期时间的缺失时间



我想使用一种方法来成功匹配没有开始和结束时间的"检查"的值。一开始我想用双线性插值来完成这个任务,但后来我觉得这太复杂了,我只需要一些非常相似的东西。

我的数据看起来像这样:

df <- data.frame("ID" = c(A,A,A,A,A,B,B,B,B,B),
"Check"= c(1:5),
"Start_time" = c("start_a1","start_a2","start_a3","start_a4","start_a5","startb1","startb2","startb3",NA,"startb5"),
"end_time" = c("end_a1","end_a2","end_a3","end_a4","end_a5","end_b1","end_b2",NA,NA,"endb5")
)

因此,理想情况下,我要查找的任何缺少开始时间和结束时间的检查都应该从下一次检查的开始时间中选择数据,而不是以前的数据。

我正在尝试以下代码块,但它给了我一个问题:

df$end_time[df$check==3 & is.na(df_main$end_time)]] <- df$start_time[df$check==5]
#this gives a length issue

任何建议在这里都会很有帮助,我的数据集包含大约5k行,每个ID都有一系列关于开始时间和结束时间的检查。

tidyr包有一个函数fill(),它正是这样做的。

library(tidyr)
df %>% 
group_by(ID) %>% 
fill(c(Start_time,end_time),.direction='up')
# A tibble: 10 × 4
# Groups:   ID [2]
ID    Check Start_time end_time
<chr> <int> <chr>      <chr>   
1 A         1 start_a1   end_a1  
2 A         2 start_a2   end_a2  
3 A         3 start_a3   end_a3  
4 A         4 start_a4   end_a4  
5 A         5 start_a5   end_a5  
6 B         1 startb1    end_b1  
7 B         2 startb2    end_b2  
8 B         3 startb3    endb5   
9 B         4 startb5    endb5   
10 B         5 startb5    endb5   

.direction="up"参数表示它使用下一个不丢失的值来填充空格。要使用上一个值,您需要使用.direction="down"。使用.direction="updown"将使用下一个值,除非该组中不再有非缺失值,否则它将使用上一个非缺失值。(在缺少值是组的最后一行的情况下很有用。(

最新更新