【发布时间】:2018-04-18 19:36:43
【问题描述】:
我有一个包含开始日期和结束日期的数据集,我想根据期间的年份拆分此数据框中的行。以这个数据框为例:
df <- data.frame("starting_date"=as.Date("2015-06-01"),"end_date"=as.Date("2017-09-30"))
应该分成 3 行,一行开始日期 2015-06-01 和结束日期 2015-12-31,一行开始日期 2016-01-01 和结束日期 2016-12-31,一行开始日期 2017-01-01 和结束日期 2017-09-30。知道怎么做吗?最后应该是这样的:
starting_date end_date
1 2015-06-01 2015-12-31
2 2016-01-01 2016-12-31
3 2017-01-01 2017-09-30
编辑:我已调整代码以在基础 R 中工作。
EDIT2:我试过了
library(dplyr)
df2 <- df[1,]
df2 <- df[-1,]
for (i in 1:dim(df)[1]){
for (j in year(df$starting_date[i]):year(df$end_date[i]))
{
df2 <- bind_rows(df2,df[i,])
}
}
它可以工作,但速度太慢了。
编辑3: 我设法复制了与所涉及的年数相等的行:
df2 <- df[rep(seq_len(nrow(df)),year(df$end_date)-year(df$starting_date)+1),]
现在我需要另一列这样的年份:
starting_date end_date years
1 2015-06-01 2017-09-30 2015
2 2015-06-01 2017-09-30 2016
3 2015-06-01 2017-09-30 2017
一旦我来到这里,就很容易获得所需的最终结果......关于如何做到这一点的任何想法? 我试图用年份制作一个单独的向量,以便将它与 df2 绑定,但它没有用....
years <- lapply(df,function(x) seq(x[,"starting_date"],length.out=x[,"year"]))
编辑4: 终于在这篇文章的帮助下做到了:R Create a time sequence as xts index based on two columns in data.frame 代码可能可以改进很多,但它可以工作....
diffs <- abs(with(df, year(starting_date)-year(end_date)))+1
df.rep <- df[rep(1:nrow(df), times=diffs), ]
reps <- rep(diffs, times=diffs)
dates.l <- apply(
df[colnames(df) %in% c("starting_date", "end_date")], 1,
function(x) {
seq(min(year(as.Date(x))), max(year(as.Date(x))))
})
years <- do.call(c, dates.l)
df.long <- cbind(df.rep, reps, years)
df.long$yearstart <- as.Date(paste0(year(df.long$years),"-01-01"))
df.long$yearend <- as.Date(paste0(year(df.long$years),"-12-31"))
df.long$starting_date2 <- pmax(df.long$starting_date,df.long$yearstart)
df.long$end_date2 <- pmin(df.long$end_date,df.long$yearend)
【问题讨论】:
-
编写一个在新 R 会话中工作的完整代码示例。
date不是基本 R 函数...例如,x = as.Date(c("2015-06-01", "2017-09-30"))似乎很合适。 -
@Frank 从技术上讲...
date是一个基本的 R 函数,但它不接受任何参数。 -
@lmo 啊,有趣。我想我从来没有见过这种情况
-
是的。我最近在查看
timestamp函数时发现。 -
我已经编辑了代码,所以它现在可以在基础 R 中使用。