R语言如何自动将每月最后一日传入函数并合并输出为data.frame
实现方案
你可以通过lubridate包快速生成目标日期序列,配合purrr包的批量迭代功能直接完成调用+合并操作,不需要手动逐个调用函数再rbind。也可以用base R实现相同效果,无需额外安装包。
1. 依赖包安装加载(仅首次使用需要安装)
# 安装包 install.packages(c("lubridate", "dplyr", "purrr")) # 加载包 library(lubridate) library(dplyr) library(purrr)
2. 修复自定义函数的逻辑错误
你现有函数中的筛选条件用了||(短回路逻辑或),仅会判断向量的第一个元素,会导致筛选结果完全不符合预期,需要改成单竖线|:
myfunct <- function (date) { # 把||改成| abc <- subset(DF, HIRE_DATE <= date | LAST_WORKING_DATE <= date ) abc <- subset(abc, TDATE <= date) augact <- abc %>% group_by(ID_Merged) %>% slice(which.max(TDATE)) augact <- subset(augact, ASSIGNMENT_STATUS == "ACTIVE") hc_cnt <- nrow(augact) x <- data.frame(date, hc_cnt) return(x) }
3. 自动生成过去4年所有月份的最后一天
# 计算起止日期:如果不需要以当前日期为终点,可以手动指定end_date和start_date end_date <- Sys.Date() start_date <- end_date - years(4) # 生成每月第一天的序列 month_seq <- seq.Date(floor_date(start_date, unit = "month"), floor_date(end_date, unit = "month"), by = "1 month") # 转换为每月最后一天 month_last_dates <- ceiling_date(month_seq, unit = "month") - days(1) # 如果需要传入字符格式日期可以用下面这行转换 # month_last_dates <- as.character(month_last_dates)
4. 批量调用函数自动合并结果
方法1:用purrr包一行完成(推荐,代码最简洁)
map_dfr会自动把所有返回结果按行合并为一个数据框:
dfmerged <- map_dfr(month_last_dates, myfunct)
方法2:base R实现(无需安装purrr)
# 先把所有运行结果存为列表 res_list <- lapply(month_last_dates, myfunct) # 把列表中所有数据框按行合并 dfmerged <- do.call(rbind, res_list)
得到的dfmerged就是你需要的包含所有月份月末日期和对应hc_cnt的结果表,格式和你手动rbind的示例完全一致。
内容的提问来源于stack exchange,提问作者Rana Usman
相关产品推荐
相关产品推荐

