两行之间的时差为NA

问题描述

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

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,2,5,8,6,NA))

我需要的是没有NA的两行之间的最大时间间隔。在前面的示例中,我需要的值是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"]))

但是我只获得最大间隔的大小,而没有指向日期的链接

希望我的问题很清楚。

预先感谢

解决方法

您可以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结合使用,并尝试更加明确:

> 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"

产生:

{{1}}