如何在 R 中根据日期创建日期数字变量?

问题描述 投票:0回答:3

我想创建一个变量,其中包含参与者参加调查的天数(第一天、第二天、第三天等) 问题是有些参与者在午夜之后接受了调查。 例如,它看起来像这样:

身份证 日期
1 2020年8月3日08:17
1 2020年8月3日12:01
1 2020年8月4日15:08
1 2020年8月4日22:16
2 2020年7月3日08:10
2 2020年7月3日12:03
2 2020年7月4日15:07
2 2020年7月5日00:16
3 2020/08/22 09:17
3 2020年8月23日11:04
3 2020/08/24 00:01
4 10/03/2020 08:37
4 2020年3月10日11:13
4 2020年4月10日15:20
4 2020年4月10日23:05

这就是我想要的:

身份证 日期
1 2020年8月3日08:17 1
1 2020年8月3日12:01 1
1 2020年8月4日15:08 2
1 2020年8月4日22:16 2
2 2020年7月3日08:10 1
2 2020年7月3日12:03 1
2 2020年7月4日15:07 2
2 2020年7月5日00:16 2
3 2020/08/22 09:17 1
3 2020/08/23 11:04 2
3 2020/08/24 00:01 2
4 10/03/2020 08:37 1
4 2020年3月10日11:13 1
4 2020年4月10日15:20 2
4 2020年4月10日23:05 2

如何创建日期变量,考虑到午夜后参加调查的参与者仍然属于前一天?

我尝试了代码这里。但我对参与者在午夜之后进行调查有疑问。

r time-series hierarchical-data mixed-models recode
3个回答
0
投票

请检查以下代码

代码

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

0
投票

这是一种明确显示考虑日期的方法。首先,确保您的

date
采用评论中建议的 POSIXct 格式(如果尚未完成)。然后,如果
hour
小于 2(午夜到凌晨 2 点),则从日期中减去 1,以便
survey_date
反映前一天。如果
hour
不小于2,则保留日期即可。时区
tz
参数设置为“”以避免混淆或不确定性。最后,按
Id
分组后,从
survey_date
first
中减去每个
survey_date
,即可得到自第一次调查以来的天数。如果需要,您可以使用
as.numeric
将此列设为数字。

注意:如果您只想记录进行调查的连续天数(并忽略调查之间的天数间隔),您可以替换最后一行:

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

对于给定的

day
,每找到一个新的
survey_date
,这都会使
Id
增加 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

0
投票

想知道是否可以针对同一问题提供任何 stata 代码?

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.