r - 根据另一个变量在 R 中按组创建日期序列

标签 r

现在,我的数据集是宽格式的,这意味着我每人一行,但我想要一个长数据集,每人多行。我有两个日期变量 ADATE 和 DDATE,我想分别将它们用作起点和终点。例如,如果某人的 ADATE 是 02/04/10,DDATE 是 02/07/10,我想要 4 行:

有:

ID ADATE     DDATE     
1  02/04/10  02/07/10 

想要:

ID ADATE     DDATE     NEW_DATE
1  02/04/10  02/07/10  02/04/10
1  02/04/10  02/07/10  02/05/10
1  02/04/10  02/07/10  02/06/10
1  02/04/10  02/07/10  02/07/10

我有多个数据集想要执行此操作,并且我编写了适用于除一个数据集之外的每个数据集的代码......我不确定为什么。这是我的尝试和我得到的错误:

jan15_long <- chf_jan15 %>%
  mutate(NEW_DATE = as.Date(ADATE)) %>%
  group_by(ID) %>%
  complete(NEW_DATE = seq.Date(as.Date(ADATE), as.Date(DDATE), by = "day")) %>%
  fill(vars) %>%
  ungroup()
Error in seq.Date(as.Date(ADATE), as.Date(DDATE), by = "day") : 
  'from' must be of length 1

上面的代码给了我我想要的东西,并且对于我拥有的所有其他数据集(11 个中的 10 个)完美运行。

有更好的方法吗? dplyr 对我来说最有意义,所以希望有一个解决方案。

最佳答案

如果有多于一行,则需要循环seq。我们可以使用map2。此外,根据“DATE”列的 formatas.Date 需要一个 format 参数,即 as.Date( ADATE, "%m/%d/%y")(假设是月/日/年格式)

library(dplyr)
library(purrr)
library(lubridate)
chf_jan15 %>%
    mutate_at(vars(ends_with("DATE")), mdy) %>%
    mutate(random_date = map2(ADATE, DDATE, seq, by = "day")) %>%
    unnest(c(random_date))
# A tibble: 4 x 4
#     ID ADATE      DDATE      random_date
#  <int> <date>     <date>     <date>     
#1     1 2010-02-04 2010-02-07 2010-02-04 
#2     1 2010-02-04 2010-02-07 2010-02-05 
#3     1 2010-02-04 2010-02-07 2010-02-06 
#4     1 2010-02-04 2010-02-07 2010-02-07 

如果只有一行,转换为 Date 类后,complete 应该可以工作

library(tidyr)
chf_jan15 %>%
   mutate_at(vars(ends_with("DATE")), as.Date, format = "%m/%d/%y") %>%
   mutate(NEW_DATE = ADATE) %>%      
   complete(NEW_DATE = seq(ADATE, DDATE, by = 'day')) %>%
   fill(c(ID, ADATE, DDATE))
# A tibble: 4 x 4
#  NEW_DATE      ID ADATE      DDATE     
#  <date>     <int> <date>     <date>    
#1 2010-02-04     1 2010-02-04 2010-02-07
#2 2010-02-05     1 2010-02-04 2010-02-07
#3 2010-02-06     1 2010-02-04 2010-02-07
#4 2010-02-07     1 2010-02-04 2010-02-07

如果每个“ID”都有一行,那么我们可以group_split并使用complete

chf_jan15 %>%
    mutate_at(vars(ends_with("DATE")), as.Date, format = "%m/%d/%y") %>%
    mutate(NEW_DATE = ADATE) %>%
    group_split(ID) %>%
    map_dfr(~ .x %>%
                 complete(NEW_DATE = seq(ADATE, DDATE, by = 'day')) %>%
                  fill(c(ID, ADATE, DDATE)))

数据

chf_jan15 <- structure(list(ID = 1L, ADATE = "02/04/10", 
    DDATE = "02/07/10"), class = "data.frame", row.names = c(NA, 
-1L))

关于r - 根据另一个变量在 R 中按组创建日期序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60009752/

相关文章:

r - R中ggplotly中图例的奇怪格式

r - 使用 length 和 integer(0) 测试条件表达式

R:从用户绘制的点生成坐标数据?

Rcurl 与 http 数据发布

r - 用离散轴注释 ggplot(带有可重复的示例)

javascript - R github渲染js文件看googleVis html

R:将行拆分为多行,然后将列拆分为多列

r - 使用 R 的加权调查数据中 logit 的边际效应

r - 将参数从对 bash 脚本的调用传递到 Rscript

r - 在 R 中使用的管道运算符