按日期序列为每个id生成行

时间:2019-01-02 16:14:39

标签: r dataframe row sequence

我的数据框看起来像这样

df <- read.table(text="
                 id          start           end
    1            2      2018-10-01    2018-12-01
    2            3      2018-01-01    2018-04-01
", header=TRUE)

我想要实现的是获取每个id的开始日期与月份之间的差异,然后针对特定的id生成每个月的新数据框。结果应为

result <- read.table(text="
                 id          date           
    1            2      2018-10-01
    2            2      2018-11-01
    3            2      2018-12-01     
    4            3      2018-01-01
    5            3      2018-02-01    
    6            3      2018-03-01    
    7            3      2018-04-01        
", header=TRUE)

2 个答案:

答案 0 :(得分:3)

使用基本R函数最直接的方法是为每行创建seq个月度日期,创建一个数据框并将它们rbind一起

do.call(rbind, with(df,lapply(1:nrow(df), function(i) 
   data.frame(id = id[i], date = seq(as.Date(start[i]), as.Date(end[i]), by = "month")))))

#  id       date
#1  2 2018-10-01
#2  2 2018-11-01
#3  2 2018-12-01
#4  3 2018-01-01
#5  3 2018-02-01
#6  3 2018-03-01
#7  3 2018-04-01

答案 1 :(得分:3)

我们可以使用Map轻松地做到这一点。将数据集的Date转换后的“开始”和“结束”列作为参数传递给Map,获取“ month”的序列作为list,并根据lengths中的list以及串联list元素以创建扩展的数据框

lst1 <- Map(seq, MoreArgs = list(by = 'month'), as.Date(df$start), as.Date(df$end))
data.frame(id = rep(df$id, lengths(lst1)), date = do.call(c, lst1))
#  id       date
#1  2 2018-10-01
#2  2 2018-11-01
#3  2 2018-12-01
#4  3 2018-01-01
#5  3 2018-02-01
#6  3 2018-03-01
#7  3 2018-04-01

或者使用tidyverse,我们将mutate的“开始”,“结束”列中的class使用Date(从{{ 1}}),获得map2日期从'开始'到'结束'purrr是'月份'的日期,并通过seq对数据集进行扩展

by
相关问题