我想使用一种方法来成功匹配没有开始和结束时间的"检查"的值。一开始我想用双线性插值来完成这个任务,但后来我觉得这太复杂了,我只需要一些非常相似的东西。
我的数据看起来像这样:
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"
将使用下一个值,除非该组中不再有非缺失值,否则它将使用上一个非缺失值。(在缺少值是组的最后一行的情况下很有用。(