问题描述
我有一个类似于以下数据帧(尽管有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 并使用range
和diff
每个组来获得最大差异,例如:
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}}