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 并使用每组 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 结合使用并尝试更明确:
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"
我有一个类似于以下的数据框(虽然有 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 并使用每组 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 结合使用并尝试更明确:
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"