首页 > 解决方案 > 如何在不使用 for 循环的情况下创建倒计时

问题描述

团队 - 感谢您的帮助。仅供参考 - 我花了最后几个小时试图找到一个不使用 for_loops 但我找不到的类似请求。

我有一个大型数据集,并且使用for循环是时间限制的。我正在尝试建立一个倒计时列,它为我提供距离下一个事件的天数。下一个“假期”事件的开始是 0。当向后工作时,它应该增加。以下是当前和期望的两个数据集。我显然是手动填写了所需的$days_till。感谢您的任何提示/帮助。

#### Current data frame######
data <- data.frame(event = c("school", "school", "school", "vacation", "school", "school", "school", "school", "vacation"), 
                   date = c("2020-01-01", "2020-01-02", "2020-01-03", "2020-01-04", "2020-01-05", "2020-01-06", "2020-01-07", "2020-01-08", "2020-01-09"), 
                   days_till = "")

#### Desired data frame######
desired <- data <- data.frame(event = c("school", "school", "school", "vacation", "school", "school", "school", "school", "vacation"), 
                              date = c("2020-01-01", "2020-01-02", "2020-01-03", "2020-01-04", "2020-01-05", "2020-01-06", "2020-01-07", "2020-01-08", "2020-01-09"), 
                              days_till = c(3,2,1,0,4,3,2,1,0))

标签: r

解决方案


这也可以

data <- data.frame(event = c("school", "school", "school", "vacation", "school", "school", "school", "school", "vacation"), 
                   date = c("2020-01-01", "2020-01-02", "2020-01-03", "2020-01-04", "2020-01-05", "2020-01-06", "2020-01-07", "2020-01-08", "2020-01-09"), 
                   days_till = "")

#### Desired data frame######
desired <- data.frame(event = c("school", "school", "school", "vacation", "school", "school", "school", "school", "vacation"), 
                              date = c("2020-01-01", "2020-01-02", "2020-01-03", "2020-01-04", "2020-01-05", "2020-01-06", "2020-01-07", "2020-01-08", "2020-01-09"), 
                              days_till = c(3,2,1,0,4,3,2,1,0))
library(dplyr)
#> 
#> Attaching package: 'dplyr'

data %>% group_by(d = data.table::rleid(event)) %>%
  mutate(date = as.Date(date),
         days_till = ifelse(event == 'vacation', last(date) - date, last(date) - date +1)) %>%
  ungroup() %>% select(-d)
#> # A tibble: 9 x 3
#>   event    date       days_till
#>   <chr>    <date>         <dbl>
#> 1 school   2020-01-01         3
#> 2 school   2020-01-02         2
#> 3 school   2020-01-03         1
#> 4 vacation 2020-01-04         0
#> 5 school   2020-01-05         4
#> 6 school   2020-01-06         3
#> 7 school   2020-01-07         2
#> 8 school   2020-01-08         1
#> 9 vacation 2020-01-09         0

reprex 包于 2021-05-10 创建 (v2.0.0 )


推荐阅读