R / tibble - 满足可变条件的子集时间序列?
R / tibble - subset time series up to variable condition met?
如何对从开始到第一次出现满足条件的变量的时间序列进行子集化?
tribble(
~t, ~x, ~y,
as.POSIXct(strptime("2011-03-27 01:30:00", "%Y-%m-%d %H:%M:%S")), -1, 1,
as.POSIXct(strptime("2011-03-27 01:30:01", "%Y-%m-%d %H:%M:%S")), -5, 2,
as.POSIXct(strptime("2011-03-27 03:45:00", "%Y-%m-%d %H:%M:%S")), -3, 5,
as.POSIXct(strptime("2011-03-27 04:20:00", "%Y-%m-%d %H:%M:%S")), -8, 3,
as.POSIXct(strptime("2011-03-27 04:25:00", "%Y-%m-%d %H:%M:%S")), -2, 8
)
例如,从开始到第一次出现 y > 4
的所有行(预计样本数据的前三行)。
h3rm4ns解决方案解释
不包括匹配条件的第一行的更简单的情况是:
%>% filter(cumsum(y > 4) == 0)
y > 4
将为 false,等于 R 中的 0
,因此 cumsum == 0
将为所有 return TRUE
(并因此过滤)行到第一个匹配 y > 4
的行,因此将 1
添加到总和中。
为了让它包含匹配的行,我们还 lag(y, default = 0)
。
您可以执行以下操作:
df %>% filter(!cumsum(lag(y, default = 0) > 4))
结果:
# A tibble: 3 x 3
t x y
<dttm> <dbl> <dbl>
1 2011-03-27 01:30:00 -1 1
2 2011-03-27 01:30:01 -5 2
3 2011-03-27 03:45:00 -3 5
如何对从开始到第一次出现满足条件的变量的时间序列进行子集化?
tribble(
~t, ~x, ~y,
as.POSIXct(strptime("2011-03-27 01:30:00", "%Y-%m-%d %H:%M:%S")), -1, 1,
as.POSIXct(strptime("2011-03-27 01:30:01", "%Y-%m-%d %H:%M:%S")), -5, 2,
as.POSIXct(strptime("2011-03-27 03:45:00", "%Y-%m-%d %H:%M:%S")), -3, 5,
as.POSIXct(strptime("2011-03-27 04:20:00", "%Y-%m-%d %H:%M:%S")), -8, 3,
as.POSIXct(strptime("2011-03-27 04:25:00", "%Y-%m-%d %H:%M:%S")), -2, 8
)
例如,从开始到第一次出现 y > 4
的所有行(预计样本数据的前三行)。
h3rm4ns解决方案解释
不包括匹配条件的第一行的更简单的情况是:
%>% filter(cumsum(y > 4) == 0)
y > 4
将为 false,等于 R 中的 0
,因此 cumsum == 0
将为所有 return TRUE
(并因此过滤)行到第一个匹配 y > 4
的行,因此将 1
添加到总和中。
为了让它包含匹配的行,我们还 lag(y, default = 0)
。
您可以执行以下操作:
df %>% filter(!cumsum(lag(y, default = 0) > 4))
结果:
# A tibble: 3 x 3
t x y
<dttm> <dbl> <dbl>
1 2011-03-27 01:30:00 -1 1
2 2011-03-27 01:30:01 -5 2
3 2011-03-27 03:45:00 -3 5