【发布时间】:2021-02-12 04:30:22
【问题描述】:
示例数据:
df <- data.frame(Date = seq(as.Date("2020-01-01"), by = "day", length.out = 12),
Phase = c(rep("stable",6),rep("instable",6)),
n = (c(rep(5,5),4,3,6,6,5,6,5)))
我想返回一个 data.frame,其中包含 n == max(n) 的日期(对于每个组),但条件是每个组必须至少有 5 天。如果一个组少于5天,那么过滤器应该调整为n == max(n) | n == max(n) - 1等等...
所以这里是一个例子:
df %>%
group_by(Phase) %>%
dplyr::filter(n == max(n)) %>%
ungroup()
# A tibble: 8 x 3
Date Phase n
<date> <chr> <dbl>
1 2020-01-01 stable 5
2 2020-01-02 stable 5
3 2020-01-03 stable 5
4 2020-01-04 stable 5
5 2020-01-05 stable 5
6 2020-01-08 instable 6
7 2020-01-09 instable 6
8 2020-01-11 instable 6
您可以看到,在第一组stable(基于列Phase)中,我的目标至少达到了5天,但在第二组instable中没有达到
为此,我编写了一个 while 循环,在每次运行中降低条件,直到满足:
i <- 0
condition <- FALSE
while(!condition) {
df_maxdays <- df %>%
group_by(Phase) %>%
dplyr::filter(n %in% (max(n, na.rm = T)-i):max(n, na.rm = T)) %>%
mutate(nn = n()) %>%
ungroup()
i <- i + 1
condition <- all(df_maxdays$nn >= 5)
}
df_maxdays
# A tibble: 11 x 4
Date Phase n nn
<date> <chr> <dbl> <int>
1 2020-01-01 stable 5 6
2 2020-01-02 stable 5 6
3 2020-01-03 stable 5 6
4 2020-01-04 stable 5 6
5 2020-01-05 stable 5 6
6 2020-01-06 stable 4 6
7 2020-01-08 instable 6 5
8 2020-01-09 instable 6 5
9 2020-01-10 instable 5 5
10 2020-01-11 instable 6 5
11 2020-01-12 instable 5 5
在我的 while 循环中,第二组 instable 现在包含 5 天,这是我想要的,但第一组现在还包含 n >= (max(n)-1) 为真的天。我希望在第二次运行时过滤器仅针对尚未达到目标的组进行调整。该示例所需的输出是:
# A tibble: 11 x 4
Date Phase n nn
<date> <chr> <dbl> <int>
1 2020-01-01 stable 5 5
2 2020-01-02 stable 5 5
3 2020-01-03 stable 5 5
4 2020-01-04 stable 5 5
5 2020-01-05 stable 5 5
7 2020-01-08 instable 6 5
8 2020-01-09 instable 6 5
9 2020-01-10 instable 5 5
10 2020-01-11 instable 6 5
11 2020-01-12 instable 5 5
【问题讨论】:
-
我不明白你的目标。您能否添加您想要实现的预期最终输出?
-
@Edo 你是对的,这并不容易跟随......我更新了我的问题,希望现在更清楚了。
-
逻辑对我来说仍然不清楚。带有“2020-01-06”的行在哪里结束?
-
在您的示例数据中,两个阶段都有 6 天。 (请参阅您的代码中的
rep("instable",6)。)您能否更新由df <-代码创建的示例数据以匹配您显示的示例数据? -
@GregorThomas 没有打印出实际的
df,在此之前有一些代码应用了过滤器:-)
标签: r while-loop dplyr