基于日期条件拆分R中的行
我有一个带有StartDate和EndDate的输入数据框,格式为日期:基于日期条件拆分R中的行,r,dataframe,dplyr,R,Dataframe,Dplyr,我有一个带有StartDate和EndDate的输入数据框,格式为日期: 输入_df: C1 C2开始日期结束日期 A B 2019年9月5日2019年12月14日 C D 2019年4月12日2019年5月14日 E F 12/5/2019 12/15/2019 我试图在某些条件下实现以下输出: -如果sys.date()小于或等于EndDate,则我希望保留该行,并添加另一行年份为+1的行 -如果sys.Date()大于EndDate,则将2019年替换为2020年 所需输出为: 输出
输入_df:
C1 C2开始日期结束日期
A B 2019年9月5日2019年12月14日
C D 2019年4月12日2019年5月14日
E F 12/5/2019 12/15/2019
我试图在某些条件下实现以下输出:
-如果sys.date()小于或等于EndDate,则我希望保留该行,并添加另一行年份为+1的行
-如果sys.Date()大于EndDate,则将2019年替换为2020年
所需输出为:
输出_df:
C1 C2开始日期结束日期
A B 2019年9月5日2019年12月14日
A B 2020年9月5日2020年12月14日
C D 4/12/2020 5/14/2020
E F 12/5/2019 12/15/2019
E F 12/5/2020 12/15/2020
我已经探索了单独的_行和lubridate,但不确定如何将if条件与这些函数结合起来。数据帧很大,我正试图避免循环执行此操作?一个选项是在将“开始日期”、“结束日期”列增加一年,然后与原始数据集绑定
library(dplyr)
library(lubridate)
input_df %>%
mutate_at(3:4, ~ mdy(.) %m+% years(1)) %>%
bind_rows(input_df %>%
mutate_at(3:4, mdy)) %>%
arrange_all() %>%
group_by(C1, C2) %>%
slice(if(first(EndDate) <= Sys.Date()) n() else row_number())
# A tibble: 5 x 4
# Groups: C1, C2 [3]
# C1 C2 StartDate EndDate
# <chr> <chr> <date> <date>
#1 A B 2019-09-05 2019-12-14
#2 A B 2020-09-05 2020-12-14
#3 C D 2020-04-12 2020-05-14
#4 E F 2019-12-05 2019-12-15
#5 E F 2020-12-05 2020-12-15
或使用
base R
nm1 <- c('StartDate', 'EndDate')
input_df[nm1] <- lapply(input_df[nm1], as.Date, format = "%m/%d/%Y")
i1 <- Sys.Date() <= input_df$EndDate
lst1 <- lapply(input_df[i1, nm1], function(date)
do.call(c, lapply(date, seq, length.out = 2, by = '1 year')))
input_df2 <- input_df[rep(seq_len(nrow(input_df)), i1 + 1),]
input_df2[rep(i1, i1 +1), nm1] <- lst1
nm1非常感谢,阿伦。这真的很有用:)如果EndDate是groupby
中传递字符串,请使用groupby\u at(vars(
或groupby(vars(-c))(“季节开始日期”,“季节结束日期”)
我使用了group_by(vars(-c(“StartDate”,“EndDate”)),它抛出了以下错误:“列vars(-c(StartDate,EndDate))
不能用作分组变量,因为它是一个quosures”
nm1 <- c('StartDate', 'EndDate')
input_df[nm1] <- lapply(input_df[nm1], as.Date, format = "%m/%d/%Y")
i1 <- Sys.Date() <= input_df$EndDate
lst1 <- lapply(input_df[i1, nm1], function(date)
do.call(c, lapply(date, seq, length.out = 2, by = '1 year')))
input_df2 <- input_df[rep(seq_len(nrow(input_df)), i1 + 1),]
input_df2[rep(i1, i1 +1), nm1] <- lst1
input_df <- structure(list(C1 = c("A", "C", "E"), C2 = c("B", "D", "F"),
StartDate = c("9/5/2019", "4/12/2019", "12/5/2019"), EndDate = c("12/14/2019",
"5/14/2019", "12/15/2019")), class = "data.frame", row.names = c(NA,
-3L))