如何让R代码自动从指定日期识别星期几,无需手动指定星期筛选条件
自动匹配指定日期对应的星期来筛选数据
我明白你现在的需求啦——原来的代码需要手动指定星期几来筛选,现在想让代码自动根据dmda这个日期变量,找出对应的星期,不用每次手动改Week == "Friday"这种条件对吧?
咱们先梳理下原来的代码逻辑:你先按Code和Week分组计算了DR1的均值,然后手动筛选星期和指定的Code。要实现自动匹配星期,关键就是从dmda里提取出对应的星期名称,而且要和数据框df里Week列的格式完全一致(比如都是首字母大写的英文全称)。
下面是优化后的代码,我把核心步骤标出来:
library(dplyr) # 原始数据 df <- structure( list( date = c("2021-06-30","2021-06-30","2021-07-07","2021-07-07","2021-07-09","2021-07-09","2021-07-09","2021-07-16"), Code = c("ABC","BCD","ABC","BCD","DCE","CDE","DCE","CDE"), Week= c("Wednesday","Wednesday","Wednesday","Wednesday","Friday","Friday","Friday","Friday"), DR1 = c(4,1,4,3,3,4,3,5) ), class = "data.frame", row.names = c(NA, -8L) ) dmda <- "2021-07-16" CodeChosse <- "CDE" # *关键步骤*:从dmda中提取对应的星期名称,和df里的Week格式匹配 # 用base R的weekdays函数,指定locale确保返回英文全称(避免系统语言影响) target_week <- weekdays(as.Date(dmda), locale = "English_US") # 分组计算均值,然后自动匹配星期和Code m <- df %>% group_by(Code, Week) %>% summarize(across(starts_with("DR1"), mean)) %>% filter(Week == target_week & Code == CodeChosse) %>% pull(DR1) # 查看结果 m
运行这段代码后,输出结果还是[1] 4.5,和之前手动指定的结果完全一致,但现在不管你把dmda改成哪一天,代码都会自动识别对应的星期,不用再手动修改筛选条件啦!
这里补充个小细节:如果你的系统默认是英文环境,weekdays(as.Date(dmda))直接就能返回正确的大写英文星期;如果是中文系统,一定要加上locale = "English_US"参数(不同系统可能需要调整locale值,比如Linux可能是"en_US.UTF-8"),这样才能和df里的Week列格式匹配。
另外,也可以用lubridate包来实现,代码会更直观:
library(lubridate) target_week <- wday(as.Date(dmda), label = TRUE, abbr = FALSE) %>% as.character()
这个方法不用操心locale的问题,返回的就是首字母大写的英文星期全称,和你的数据格式完全匹配。
内容的提问来源于stack exchange,提问作者user16774617
相关产品推荐
相关产品推荐

