簡體   English   中英

如何根據日期在 R 中創建天數變量?

[英]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)

output

#>   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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM