假设我有这个琐碎的数据表:
我想根据
然而,我不想在很长时间内失去信息。因此,如果上述条件没有匹配,我需要确保没有大于3天的“被过滤掉”的时间段。
在上述情况下,基于
注意到末尾有一长串的
即确保每三行中有一行被接受,但它不能放置最佳或最少的额外行。
最佳结果是一个过滤器,在一行“FALSE”的中间位置(或者需要多少个位置)用单个“TRUE”打破该行。
library(data.table)
dt <- data.table(
day = 1:10,
a = c(0, 1, 10, 2, 2.5, 2.3, 2.7, 2.9, 5, 8)
)
我想根据
a
上的某些条件对其进行过滤。在这种情况下,就是当 a
变化超过 3 时的时刻。这很简单:dt[abs(a - shift(a)) >= 3]
然而,我不想在很长时间内失去信息。因此,如果上述条件没有匹配,我需要确保没有大于3天的“被过滤掉”的时间段。
在上述情况下,基于
a
的条件被满足:dt[, abs(a - shift(a)) >= 3]
# [1] NA FALSE TRUE TRUE FALSE FALSE FALSE FALSE FALSE TRUE
-----------------------------
注意到末尾有一长串的
FALSE
。我能想到的最好解释是:dt[, abs(a - shift(a)) >= 3 | .I %% 3 == 0]
# [1] NA FALSE TRUE TRUE FALSE TRUE FALSE FALSE TRUE TRUE
---- ----
即确保每三行中有一行被接受,但它不能放置最佳或最少的额外行。
最佳结果是一个过滤器,在一行“FALSE”的中间位置(或者需要多少个位置)用单个“TRUE”打破该行。
# [1] NA FALSE TRUE TRUE FALSE FALSE TRUE FALSE FALSE TRUE
----
.I %%3 == 0
条件,它可以确保不存在超过3个的连续行。然而,在选择需要打破连续行的行时,它并不是非常高效,这正是我提出这个问题的原因:看看是否有更好的解决方案。 - Wasabiday
除了“1”以外,永远不会有其他不同的值),还是真的是“3天”,而且day
可以变化不止1? - r2evans