NA 两行之间的时间差

Time difference between two rows with NA

我有一个类似于以下的数据框(虽然有 80000 行),其中第一列是“Date.Time”,其余列是具有一些 NA 值的变量。作为代表示例:

df <- data.frame(
Date= c("2020-01-01 09:50:00", "2020-01-01 09:51:30", "2020-01-01 09:53:00", "2020-01-01 09:54:00",
"2020-01-01 09:55:00", "2020-01-01 09:57:30", "2020-01-01 09:59:00", "2020-01-01 10:01:00"),
Variable1 = c(10,15,NA,25,22,10,11,NA),
Variable2 = c(1,NA,2,5,8,6,8,NA))

我需要的是没有NA的2行之间的最大时间间隔。在前面的示例中,我需要的值是 Variable1 和 Date[7,1]-Date[4,1](因为 Date[2,1]-Date[1,1] 是一个更小的时间间隔),而对于 Variable2 它将是 Date[7,1]-Date [3,1]

我一直在尝试使用 rle() 函数,为每个变量获取 NA 和非 NA 的区间:

is.na.rle222 <- rle(is.na(df[, "Variable1"]))

但是我只获取了没有link日期的最大区间的大小。

希望我的问题很清楚。

提前致谢

您可以 split Date 并使用每组 rangediff 获得最大差异,例如:

i <- cumsum(c(1, abs(diff(is.na(df$Variable1)))))
x <- lapply(split(as.POSIXct(df$Date), i), function(x) diff(range(x)))
x[[which.max(x)]]
#Time difference of 5 mins

将@GKi 中的逻辑与 dplyr 结合使用并尝试更明确:

require(dplyr)
(
  df
  %>% mutate(Var1_interval_grp = cumsum(c(1, abs(diff(is.na(df$Variable1))))),
             Var2_interval_grp = cumsum(c(1, abs(diff(is.na(df$Variable2))))))
  %>% group_by(Var1_interval_grp)
  %>% mutate(Range_Var1 = diff(range(as.POSIXct(Date))))
  %>% ungroup
  %>% group_by(Var2_interval_grp)
  %>% mutate(Range_Var2 = diff(range(as.POSIXct(Date))))
  %>% ungroup
  %>% select(! contains("grp"))
) -> df

现在的输出是:

> df 
# A tibble: 8 x 5
  Date                Variable1 Variable2 Range_Var1 Range_Var2
  <chr>                   <dbl>     <dbl> <drtn>     <drtn>    
1 2020-01-01 09:50:00        10         1  90 secs     0 secs  
2 2020-01-01 09:51:30        15        NA  90 secs     0 secs  
3 2020-01-01 09:53:00        NA         2   0 secs   360 secs  
4 2020-01-01 09:54:00        25         5 300 secs   360 secs  
5 2020-01-01 09:55:00        22         8 300 secs   360 secs  
6 2020-01-01 09:57:30        10         6 300 secs   360 secs  
7 2020-01-01 09:59:00        11         8 300 secs   360 secs  
8 2020-01-01 10:01:00        NA        NA   0 secs     0 secs  

并且很容易获得达到最大值的日期:

(
  df
  %>% filter(Range_Var1 == max(Range_Var1))
  %>% pull(Date)
) 

产生:

[1] "2020-01-01 09:54:00" "2020-01-01 09:55:00" "2020-01-01 09:57:30"
[4] "2020-01-01 09:59:00"