如何在R中创建基于日期的天数变量?

khbbv19g  于 2023-01-22  发布在  其他
关注(0)|答案(2)|浏览(116)

我想创建一个变量,其中包含参与者参加调查的天数(第一天、第二天、第三天等)。问题是有些参与者在午夜之后参加了调查。例如,如下所示:
| 身份证|日期|
| - ------|- ------|
| 1个|2020年8月3日8时17分|
| 1个|2020年3月8日12时01分|
| 1个|2020年8月4日15:08|
| 1个|2020年4月8日22时16分|
| 第二章|2020年7月3日8时10分|
| 第二章|2020年7月3日12时03分|
| 第二章|2020年7月4日15:07|
| 第二章|2020年5月7日00:16|
| 三个|2020年8月22日09:17|
| 三个|2020年8月23日11:04|
| 三个|2020年8月24日00:01|
| 四个|2020年10月3日08时37分|
| 四个|2020年10月3日11时13分|
| 四个|2020年10月4日15时20分|
| 四个|2020年10月4日23时05分|
这就是我想要的
| 身份证|日期|日|
| - ------|- ------|- ------|
| 1个|2020年8月3日8时17分|1个|
| 1个|2020年3月8日12时01分|1个|
| 1个|2020年8月4日15:08|第二章|
| 1个|2020年4月8日22时16分|第二章|
| 第二章|2020年7月3日8时10分|1个|
| 第二章|2020年7月3日12时03分|1个|
| 第二章|2020年7月4日15:07|第二章|
| 第二章|2020年5月7日00:16|第二章|
| 三个|2020年8月22日09:17|1个|
| 三个|2020年8月23日11:04|第二章|
| 三个|2020年8月24日00:01|第二章|
| 四个|2020年10月3日08时37分|1个|
| 四个|2020年10月3日11时13分|1个|
| 四个|2020年10月4日15时20分|第二章|
| 四个|2020年10月4日23时05分|第二章|
如何创建日变量,同时考虑到午夜后参加调查的参与者仍属于前一天?
我尝试了代码here。但我有问题与参与者午夜后进行调查。

7d7tgy0s

7d7tgy0s1#

请检查以下代码
编号

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
gpnt7bae

gpnt7bae2#

这里有一种方法可以显式地显示所考虑的日期。首先,确保您的date是注解中建议的POSIX格式(如果尚未完成)。然后,如果hour小于2(午夜到凌晨2点)从日期中减去1,使survey_date反映前一天。如果hour不小于2,只需保留日期。时区tz参数设置为""以避免混淆或不确定。最后,按Id分组后,从firstsurvey_date中减去每个survey_date,以获得自第一次调查以来的天数。如果需要,您可以使用as.numeric使此列变为数字。
注意:如果您只想记录调查的连续天数(并忽略调查之间的天数间隔),您可以替换最后一行:

mutate(day = cumsum(survey_date != lag(survey_date, default = first(survey_date))) + 1)

对于给定的Id,每发现一个新的survey_dateday就增加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)
    • 产出**
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

相关问题