从重复的日期创建观察虚拟变量

时间:2019-07-12 08:54:53

标签: r dplyr

我正在处理大型时间序列数据集。我有多个人(id),他们在许多天(日期)中每小时(小时)进行一次分析。但是,并非在同一日期观察到所有个体。我想创建一个新变量(obs),从1:n开始列出每个人的日期,以便同一天的每个小时测定获得相同的数字。

我认为我可以通过使用group_by(id,date)在dplyr中轻松完成此操作,并通过mutate计算每个id的日期长度,但这只是复制了我不需要的'hour'变量。

# what i have

    id <- rep(c("id1", "id2"), each = 6)
    date <- as.Date(rep(c("2018-3-13", "2018-3-14", "2018-4-11", "2018-4-12"), each = 3))
    hour <- rep(1:3, 4)
    data.have <- data.frame(id, date, hour)

# attempt 1 - just replicates 'hour' which I don't want

    data.have %>%
      group_by(id, date) %>%
      arrange(date) %>%
      mutate(obs = 1:length(date))

# what i want

    obs <- rep(1:2, each =3, times = 2)
    data.want <- data.frame(id, date, hour, obs)

´´´

3 个答案:

答案 0 :(得分:1)

您可以使用dense_rank进行操作,并且只能按ID分组

data.have %>% 
    group_by(id) %>% 
    mutate(obs=dense_rank(date))

答案 1 :(得分:0)

一个稍作弊的解决方案是按id分组,然后将日期转换为一个因子,然后再返回一个数字:

data.have %>%
  group_by(id) %>% 
  mutate(obs = as.numeric(as.factor(date)))

答案 2 :(得分:0)

出于非技术性原因,我将采用另一种方法:我将介绍一个相对日期,即自首次观察以来的天数:

data.have %>% group_by(id) %>% arrange(date) %>% mutate(reldate=date - date[1])

造成这种情况的原因有很多,但是最重要的是,根据我的经验,此类临床数据迟早需要一个相对日期以便进行分析,因此最好早一点生成。

实际上,这 可能就是您想要的值。

data.want <- data.have %>% group_by(id) %>% 
             arrange(date) %>% 
             mutate(reldate=date - date[1]) %>% 
             mutate(times=as.numeric(reldate + 1))

当然,假设每天进行一次测量。如果没有,则可以通过将reldate转换为factor并将其作为数字矢量来创建time变量。