如何在r中创建倒计时而不使用for循环

如何在r中创建倒计时而不使用for循环,r,R,团队-感谢您的帮助。仅供参考-我花了几个小时试图找到一个类似的请求,它不用于_循环,但我找不到 我有一个很大的数据集,使用for循环是有时间限制的。我正在尝试构建一个倒计时列,该列提供距离下一个事件的天数。下一个“假期”事件的开始时间为0。当向后工作时,它应该增加。下面是两个当前和需要的数据集。很明显,我手工填写了所需的$days\u till。谢谢你的提示/帮助 #### Current data frame###### data <- data.frame(event = c(&quo

团队-感谢您的帮助。仅供参考-我花了几个小时试图找到一个类似的请求,它不用于_循环,但我找不到

我有一个很大的数据集,使用
for
循环是有时间限制的。我正在尝试构建一个倒计时列,该列提供距离下一个事件的天数。下一个“假期”事件的开始时间为0。当向后工作时,它应该增加。下面是两个当前和需要的数据集。很明显,我手工填写了所需的$days\u 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))
当前数据帧######
数据以下是基于
tidyverse
软件包的答案。通常,我建议使用适当的数据类型。也就是说,将日期变量设置为
日期类型
。通过这种方式,您可以利用各种有用的功能(或获得适当的尺寸输出)

您可以使用的方法如下:

  • 确定并为每行分配下一个假期开始
  • 确定下一个假期开始日期和(行)日期之间的差异
跟进问题:多个学生-->分组人()

#生成多学生数据
数据%mutate(日期=ymd(日期),student=“S1”)
数据2%
#用不同的假期日期替换几个日期
在%c(3,6,9)“假期”、“学校”中更改(事件=if_else(日期)%)
,student=“S2”)
数据%
#------------------------所有团体的行动---------
变化(截止日期=如果其他(事件==“假期”,日期,如.date(NA)))%>%
填充(截止日期,.direction=“up”)%>%
mutate(days\u till=(days\u till-date)%>%as.integer())
这将产生

   event    date       days_till student
   <chr>    <date>         <int> <chr>  
 1 school   2020-01-01         3 S1     
 2 school   2020-01-02         2 S1     
 3 school   2020-01-03         1 S1     
 4 vacation 2020-01-04         0 S1     
 5 school   2020-01-05         4 S1     
 6 school   2020-01-06         3 S1     
 7 school   2020-01-07         2 S1     
 8 school   2020-01-08         1 S1     
 9 vacation 2020-01-09         0 S1     
10 school   2020-01-01         2 S2     
11 school   2020-01-02         1 S2     
12 vacation 2020-01-03         0 S2     
13 school   2020-01-04         2 S2     
14 school   2020-01-05         1 S2     
15 vacation 2020-01-06         0 S2     
16 school   2020-01-07         2 S2     
17 school   2020-01-08         1 S2     
18 vacation 2020-01-09         0 S2
event date days\u to student
1学校2020-01-01 3中一
2学校2020-01-02 2中一
3学校2020-01-03 1中一
4假期2020-01-04 0 S1
5学校2020-01-05 4中一
6学校2020-01-06 3中一
7学校2020-01-07 2中一
8学校2020-01-08 1中一
9假期2020-01-09 0 S1
10学校2020-01-01 2 S2
11学校2020-01-02 1 S2
12假期2020-01-03 0 S2
13学校2020-01-04 2 S2
14学校2020-01-05 1 S2
15假期2020-01-06 0 S2
16学校2020-01-07 2 S2
17学校2020-01-08 1 S2
18假期2020-01-09 0 S2

以下是基于
tidyverse
软件包的答案。通常,我建议使用适当的数据类型。也就是说,将日期变量设置为
日期类型
。通过这种方式,您可以利用各种有用的功能(或获得适当的尺寸输出)

您可以使用的方法如下:

  • 确定并为每行分配下一个假期开始
  • 确定下一个假期开始日期和(行)日期之间的差异
跟进问题:多个学生-->分组人()

#生成多学生数据
数据%mutate(日期=ymd(日期),student=“S1”)
数据2%
#用不同的假期日期替换几个日期
在%c(3,6,9)“假期”、“学校”中更改(事件=if_else(日期)%)
,student=“S2”)
数据%
#------------------------所有团体的行动---------
变化(截止日期=如果其他(事件==“假期”,日期,如.date(NA)))%>%
填充(截止日期,.direction=“up”)%>%
mutate(days\u till=(days\u till-date)%>%as.integer())
这将产生

   event    date       days_till student
   <chr>    <date>         <int> <chr>  
 1 school   2020-01-01         3 S1     
 2 school   2020-01-02         2 S1     
 3 school   2020-01-03         1 S1     
 4 vacation 2020-01-04         0 S1     
 5 school   2020-01-05         4 S1     
 6 school   2020-01-06         3 S1     
 7 school   2020-01-07         2 S1     
 8 school   2020-01-08         1 S1     
 9 vacation 2020-01-09         0 S1     
10 school   2020-01-01         2 S2     
11 school   2020-01-02         1 S2     
12 vacation 2020-01-03         0 S2     
13 school   2020-01-04         2 S2     
14 school   2020-01-05         1 S2     
15 vacation 2020-01-06         0 S2     
16 school   2020-01-07         2 S2     
17 school   2020-01-08         1 S2     
18 vacation 2020-01-09         0 S2
event date days\u to student
1学校2020-01-01 3中一
2学校2020-01-02 2中一
3学校2020-01-03 1中一
4假期2020-01-04 0 S1
5学校2020-01-05 4中一
6学校2020-01-06 3中一
7学校2020-01-07 2中一
8学校2020-01-08 1中一
9假期2020-01-09 0 S1
10学校2020-01-01 2 S2
11学校2020-01-02 1 S2
12假期2020-01-03 0 S2
13学校2020-01-04 2 S2
14学校2020-01-05 1 S2
15假期2020-01-06 0 S2
16学校2020-01-07 2 S2
17学校2020-01-08 1 S2
18假期2020-01-09 0 S2
这也可以

数据附加包:“dplyr”
数据%>%分组依据(d=data.table::rleid(事件))%>%
变异(日期=as.date(日期),
截止日期=ifelse(事件=‘休假’、上次(日期)-日期、上次(日期)-日期+1))%>%
解组()%>%select(-d)
#>#tibble:9 x 3
#>活动日期至
#>                
#>1学校2020-01-01 3
#>2学校2020-01-02 2
#>3学校2020-01-03 1
#>4假期2020-01-04 0
#>5学校2020-01-05 4
#>6学校2020-01-06 3
#>7学校2020-01-07 2
#>8学校2020-01-08 1
#>9假期2020-01-09 0
由(v2.0.0)于2021年5月10日创建,也可以

数据附加包:“dplyr”
数据%>%分组依据(d=data.table::rleid(事件))%>%
变异(日期=as.date(日期),
截止日期=ifelse(事件=‘休假’、上次(日期)-日期、上次(日期)-日期+1))%>%
解组()%>%select(-d)
#>#tibble:9 x 3
#>活动日期至
#>                
#>1学校2020-01-01 3
#>2学校2020-01-02 2
#>3学校2020-01-03 1
#>4假期2020-01-04 0
#>5学校2020-01-05 4
#>6学校2020-01-06 3
#>7学校2020-01-07 2
#>8学校2020-01-08 1
#>9假期2020-01-09 0

由(v2.0.0)于2021-05-10创建。

如果streak有1天以上的假期怎么办?如果streak有1天以上的假期怎么办?Ray-感谢您的快速回复!我喜欢使用fil
# generate multi-student data
data  <- data %>% mutate(date = ymd(date), student = "S1")
data2 <- data %>% 
   # replace a few dates with different vacation dates
   mutate(event = if_else(day(date) %in% c(3,6,9), "vacation", "school")
 , student = "S2")

data <- bind_rows(data, data2)

# group by student and run same routine
data <- data %>% 
#------------------------- group-by ------------------------
  group_by(student) %>%
#------------------------ operation over all groups ---------
    mutate( days_till = if_else(event == "vacation", date, as.Date(NA))) %>%   
    fill(   days_till, .direction = "up") %>%
    mutate (days_till = (days_till - date) %>% as.integer() )
   event    date       days_till student
   <chr>    <date>         <int> <chr>  
 1 school   2020-01-01         3 S1     
 2 school   2020-01-02         2 S1     
 3 school   2020-01-03         1 S1     
 4 vacation 2020-01-04         0 S1     
 5 school   2020-01-05         4 S1     
 6 school   2020-01-06         3 S1     
 7 school   2020-01-07         2 S1     
 8 school   2020-01-08         1 S1     
 9 vacation 2020-01-09         0 S1     
10 school   2020-01-01         2 S2     
11 school   2020-01-02         1 S2     
12 vacation 2020-01-03         0 S2     
13 school   2020-01-04         2 S2     
14 school   2020-01-05         1 S2     
15 vacation 2020-01-06         0 S2     
16 school   2020-01-07         2 S2     
17 school   2020-01-08         1 S2     
18 vacation 2020-01-09         0 S2