使用case_when转换月份至季度的R代码结果与教授不符问题排查
问题:月份转季度的统计结果与预期不符
我编写了一个用case_when将月份缩写转换为季度的函数,通过mutate生成新变量Qtr后统计各季度的观测数量,但结果和教授的统计值(161,071、85,588、100,227、142,651)不一致,我的结果是152174、165778、205615、174592,不确定代码是否存在问题。
我的R代码如下:
convert_to_qtr <- function(Month) { case_when( Month == "Jan" ~ "Q1", Month == "Feb" ~ "Q1", Month == "Mar" ~ "Q1", Month == "Apr" ~ "Q2", Month == "May" ~ "Q2", Month == "Jun" ~ "Q2", Month == "Jul" ~ "Q3", Month == "Aug" ~ "Q3", Month == "Sep" ~ "Q3", Month == "Oct" ~ "Q4", Month == "Nov" ~ "Q4", Month == "Dec" ~ "Q4" ) } example_months <- c("Jan", "Mar", "May", "May", "Aug", "Nov", "Nov", "Dec") convert_to_qtr(example_months) df %>% mutate(Qtr = convert_to_qtr(Month)) %>% group_by(Qtr) %>% count(Qtr)
排查方向
- 检查原始数据的月份格式:
case_when的匹配是严格的,若df$Month存在大小写不一致(如jan/JAN)、拼写错误(如Sept而非Sep)、空值/NA,这些观测无法被匹配到对应季度,会导致统计结果偏差。可以用unique(df$Month)查看所有月份取值,确认是否有不在函数匹配列表中的内容。 - 验证函数逻辑:用
example_months测试,函数返回["Q1", "Q1", "Q2", "Q2", "Q3", "Q4", "Q4", "Q4"],逻辑本身是正确的,问题大概率出在原始数据上。 - 简化统计逻辑:
group_by(Qtr)后count(Qtr)可以简化为直接count(Qtr)(count会自动按目标列分组),避免残留分组导致的统计错误。 - 更健壮的转换方式:可以用
lubridate包的工具实现更通用的月份转季度,减少手动匹配的误差:library(lubridate) df %>% mutate(Qtr = paste0("Q", quarter(parse_date_time(Month, "abbrev")))) %>% count(Qtr)
内容的提问来源于stack exchange,提问作者Issam K
相关产品推荐
相关产品推荐

