我想创建一个变量,其中包含参与者参加调查的天数(第一天、第二天、第三天等) 问题是有些参与者在午夜之后接受了调查。 例如,它看起来像这样:
身份证 | 日期 |
---|---|
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 |
如何创建日期变量,考虑到午夜后参加调查的参与者仍然属于前一天?
我尝试了代码这里。但我对参与者在午夜之后进行调查有疑问。
请检查以下代码
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
分组后,从 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
想知道是否可以针对同一问题提供任何 stata 代码?