[英]How can I create a day number variable in R based on dates?
我想用參與者參加調查的日期(第一天、第二天、第三天等)創建一個變量。問題是有些參與者是在午夜后參加調查的。 例如,這是它的樣子:
ID | 日期 |
---|---|
1個 | 08/03/2020 08:17 |
1個 | 08/03/2020 12:01 |
1個 | 08/04/2020 15:08 |
1個 | 08/04/2020 22:16 |
2個 | 07/03/2020 08:10 |
2個 | 07/03/2020 12:03 |
2個 | 07/04/2020 15:07 |
2個 | 07/05/2020 00:16 |
3個 | 08/22/2020 09:17 |
3個 | 08/23/2020 11:04 |
3個 | 08/24/2020 00:01 |
4個 | 10/03/2020 08:37 |
4個 | 10/03/2020 11:13 |
4個 | 10/04/2020 15:20 |
4個 | 10/04/2020 23:05 |
這就是我要的:
ID | 日期 | 天 |
---|---|---|
1個 | 08/03/2020 08:17 | 1個 |
1個 | 08/03/2020 12:01 | 1個 |
1個 | 08/04/2020 15:08 | 2個 |
1個 | 08/04/2020 22:16 | 2個 |
2個 | 07/03/2020 08:10 | 1個 |
2個 | 07/03/2020 12:03 | 1個 |
2個 | 07/04/2020 15:07 | 2個 |
2個 | 07/05/2020 00:16 | 2個 |
3個 | 08/22/2020 09:17 | 1個 |
3個 | 08/23/2020 11:04 | 2個 |
3個 | 08/24/2020 00:01 | 2個 |
4個 | 10/03/2020 08:37 | 1個 |
4個 | 10/03/2020 11:13 | 1個 |
4個 | 10/04/2020 15:20 | 2個 |
4個 | 10/04/2020 23:05 | 2個 |
我如何創建日期變量,考慮到午夜后參加調查的參與者仍然屬於前一天?
我試過這里的代碼。 但我對參與者在午夜后進行調查有疑問。
請檢查以下代碼
data2 <- data %>%
mutate(date2 = as.Date(date, format = "%m/%d/%Y %H:%M")) %>%
group_by(id) %>%
mutate(row = row_number(),
date3 = as.Date(ifelse(row == 1, date2, NA), origin = "1970-01-01")) %>%
fill(date3) %>%
ungroup() %>%
mutate(diff = as.numeric(date2 - date3 + 1)) %>%
select(-date2, -date3, -row)
#> id date diff
#> 1 1 08/03/2020 08:17 1
#> 2 1 08/03/2020 12:01 1
#> 3 1 08/04/2020 15:08 2
#> 4 1 08/04/2020 22:16 2
#> 5 2 07/03/2020 08:10 1
#> 6 2 07/03/2020 12:03 1
#> 7 2 07/04/2020 15:07 2
#> 8 2 07/05/2020 00:16 3
這是一種明確顯示考慮日期的方法。 首先,請確保您的date
采用評論中建議的 POSIXct 格式(如果尚未完成)。 然后,如果hour
小於 2(午夜到凌晨 2 點),則從日期中減去 1,以便survey_date
反映前一天。 如果hour
不小於2,就保留日期。 時區tz
參數設置為 "" 以避免混淆或不確定。 最后,按Id
分組后,從第first
survey_date
中減去每個survey_date
以獲得自第一次調查以來的天數。 如果需要,您可以使用as.numeric
使此列成為數字。
注意:如果您只想記錄參加調查的連續天數(並忽略調查之間天數的差距),您可以替換最后一行:
mutate(day = cumsum(survey_date != lag(survey_date, default = first(survey_date))) + 1)
對於給定的Id
,每找到一個新的survey_date
就會將day
增加 1。
library(tidyverse)
library(lubridate)
df %>%
mutate(date = as.POSIXct(date, format = "%m/%d/%Y %H:%M", tz = "")) %>%
mutate(survey_date = if_else(hour(date) < 2,
as.Date(date, format = "%Y-%m-%d", tz = "") - 1,
as.Date(date, format = "%Y-%m-%d", tz = ""))) %>%
group_by(Id) %>%
mutate(day = survey_date - first(survey_date) + 1)
Output
Id date survey_date day
<int> <dttm> <date> <drtn>
1 1 2020-08-03 08:17:00 2020-08-03 1 days
2 1 2020-08-03 12:01:00 2020-08-03 1 days
3 1 2020-08-04 15:08:00 2020-08-04 2 days
4 1 2020-08-04 22:16:00 2020-08-04 2 days
5 2 2020-07-03 08:10:00 2020-07-03 1 days
6 2 2020-07-03 12:03:00 2020-07-03 1 days
7 2 2020-07-04 15:07:00 2020-07-04 2 days
8 2 2020-07-05 00:16:00 2020-07-04 2 days
9 3 2020-08-22 09:17:00 2020-08-22 1 days
10 3 2020-08-23 11:04:00 2020-08-23 2 days
11 3 2020-08-24 00:01:00 2020-08-23 2 days
12 4 2020-10-03 08:37:00 2020-10-03 1 days
13 4 2020-10-03 11:13:00 2020-10-03 1 days
14 4 2020-10-04 15:20:00 2020-10-04 2 days
15 4 2020-10-04 23:05:00 2020-10-04 2 days
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.