我有一张这样的表:
customer ID startdate enddate
11 22 2015-01-01 2015-03-01
11 55 2018-04-03 2018-06-16
22 33 2017-02-01 2017-04-01
这是我想要的输出:
customer Id YearMonth
11 22 201501
11 22 201502
11 22 201503
11 55 201804
11 55 201805
11 55 201806
22 33 201702
22 33 201703
22 33 201704
22 33 201505
我已经开始编写这个函数了:
datseq<-function(t1,t2) {
seq(as.Data(t1), as.Date(t2), by="month")
}
我的问题是:
一个。如何更正函数以返回YYYYMM格式?
湾如何在数据框架上实现此功能,以便每个客户和ID都能获得适当的月份列表?输出应该是数据帧。
谢谢
答案 0 :(得分:2)
我们可以使用data.table
执行此操作,按行序列分组,从“开始日期”创建序列。要结束&#39;,将by
指定为每月format
Date
类,以返回预期格式("%Y%m"
)
library(data.table)
setDT(df1)[, .(customer = customer[1], Id = ID[1],
YearMonth = format(seq(startdate, enddate, by = '1 month'), "%Y%m")),
by = 1:nrow(df1)]
这也可以使用tidyverse
library(tidyverse)
df1 %>%
mutate(YearMonth = map2(startdate, enddate,
~ seq(.x, .y, by = "1 month") %>%
format(., format = "%Y%m"))) %>%
select(-startdate, enddate) %>%
unnest
如果我们需要base R
选项,则可以使用Map
lst <- Map(function(x, y) seq(x, y, by = '1 month'), df1$startdate, df1$enddate)
按lengths
的{{1}}复制数据集的行,并创建一个列&#39; YearMonth&#39;通过连接list
元素然后获得预期的list
format