如何在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