R语言散点图生成代码优化:选日期自动识别星期 无需手动指定i向量
优化实现方案
核心逻辑是将星期匹配、均值/标准差计算逻辑移入绘图函数内部,通过lubridate的日期工具自动识别输入日期对应的星期,无需手动指定i向量。
完整优化后代码
library(dplyr) library(ggplot2) library(tidyr) library(lubridate) library(readxl) # 补充读取Excel文件的依赖包 # 数据读取与预处理 df <- read_excel('C:/Users/Downloads/database_test1.xlsx') df <- subset(df, df$date2 < df$date1) dim_data <- dim(df) day <- seq.Date(from = as.Date(df$date2[1]), to = as.Date(df$date2[dim_data[1]]), by = "1 day") df_grouped <- df %>% mutate(across(starts_with("date"), as.Date)) %>% group_by(date2) %>% summarise(Id = first(Id), date1 = first(date1), Week = first(Week), D = first(D), D1 = sum(D1)) %>% select(Id, date1, date2, Week, D, D1) # 提前筛选D为空的样本,固定逻辑无需每次调用重复计算 df_OC <- subset(df_grouped, is.na(D)) # 绘图函数,输入目标日期即可自动计算对应星期的参考线 scatter_date <- function(dt, dta = df) { # 1. 自动识别输入日期对应的英文星期全称,强制指定英文locale避免系统语言差异问题 target_week <- as.character(wday(ymd(dt), label = TRUE, abbr = FALSE, locale = "en_US.UTF-8")) # 2. 筛选对应星期的样本,动态计算均值和标准差 ds_OC <- subset(df_OC, Week == target_week) mean_Week <- mean(as.numeric(ds_OC$D1)) sdeviation_Week <- sd(as.numeric(ds_OC$D1)) # 3. 绘制散点图+参考线 dta %>% filter(date2 == ymd(dt)) %>% summarize(across(starts_with("DR"), sum)) %>% pivot_longer(everything(), names_pattern = "DR(.+)", values_to = "val") %>% mutate(name = as.numeric(name)) %>% plot(xlab = "Days", ylab = "Types", xlim = c(0, 7), ylim = c((min(.$val) %/% 10) * 10, (max(.$val) %/% 10 + 1) * 15)) abline(h = mean_Week, col = 'blue') abline(h = mean_Week + sdeviation_Week, col = 'green', lty = 2) abline(h = mean_Week - sdeviation_Week, col = 'orange', lty = 2) } # 测试调用,无需手动设置i值 scatter_date("2021-04-10", df)
优化说明
- 移除了原代码中手动定义的
i向量、全局均值/标准差计算逻辑,改为在每次调用绘图函数时动态计算 - 使用
wday()函数自动识别输入日期的星期名称,直接匹配数据集Week字段筛选样本,无需人工干预 - 测试场景:输入日期
2021-04-10时,wday()会自动返回Saturday,匹配原代码i=3的筛选效果,输出完全一致的散点图
内容的提问来源于stack exchange,提问作者Antonio
相关产品推荐
相关产品推荐

