【发布时间】:2019-09-11 19:24:34
【问题描述】:
假设我有这个微不足道的 data.table:
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
----
【问题讨论】:
-
要稳健(捕获所有出现)且高效(仅保存需要的行),您将需要一种迭代方法。 (1) 对基本条件进行过滤; (2) 对于每个“太长”的间隔,根据前后行确定您的间隔,并将其包含在您的逻辑中。不漂亮,但我不知道是否有一个简单的“运行逻辑”可以涵盖您的所有条件。
-
@r2evans 我认为不需要“最佳”间隔。间隔是预定义的:“确保每第三 (n) 行被接受”.
-
是的,我并没有假设所有行总是相隔 1 天。 (我在数据处理方面有点偏执和防御性,其中 1 行的滞后并不总是意味着 1 天的滞后,也许是同一天或一周不同。)也许我过于复杂了. (如果 OP 语言改为 “没有超过 3 个行”的过滤拉伸“,那么它将是明确的。)
-
同样,“每 3 天” 事情从最近的“条件满足”行开始,不一定基于“行号模数 3”,因为可以引入比严格必要的更多的行。 (因此我对“稳健而高效”的评论是一种谨慎的平衡。)
-
@r2evans 没错。我添加
.I %%3 == 0条件的解决方案可以确保不存在长于3 的条纹。然而,它在如何选择打破条纹所需的行方面效率不高,这正是我问这个问题的原因:看看是否有更好的解决方案。
标签: r data.table