我的数据框看起来像这样
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)
答案 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