使用dplyr的group_by()和summarise()时,数据框中因子水平'July'无法被识别的问题求助
使用dplyr的group_by()和summarise()时,数据框中因子水平'July'无法被识别的问题求助
嗨,Alice!这种问题我之前也踩过坑,大概率是原始数据里的Month列中,"July"的拼写和你定义的month_levels里的版本不完全一致——这种细节真的太容易忽略了!
先给你捋捋可能的原因和对应的解决办法:
第一步:先排查原始数据的匹配问题
你先跑一行代码,看看原始数据里Month列的所有唯一值,就能一眼看出问题:
# 查看原始数据中Month列的全部唯一取值,重点看July相关的条目 unique(MyDf$Month)
你很可能会发现:原始数据里的"July"要么是小写的july、要么是缩写Jul、要么前面/后面多了空格(比如 July),甚至可能是带特殊字符的全角版本,这些都会导致和你定义的July不匹配,转成有序因子时直接变成NA。
第二步:针对性修正问题
根据你排查出的结果,选对应的方法处理:
大小写不一致:统一格式后再转因子
用stringr包的str_to_title()把所有月份转成首字母大写的格式,确保和你的month_levels完全匹配:library(dplyr) library(stringr) month_levels = c('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December') Df_Average_Month <- MyDf %>% # 先统一Month的大小写格式 mutate(Month = str_to_title(Month)) %>% # 再转成指定顺序的有序因子 mutate(Month = ordered(Month, levels = month_levels)) %>% group_by(Month) %>% # 别忘了加上计算均值的summarise步骤! summarise(Average_Daffodil_Bulbs = mean(Daffodil_Bulbs, na.rm = TRUE))有多余空格:先去掉前后空格
如果是Month值前后有看不见的空格,用str_trim()清理:Df_Average_Month <- MyDf %>% mutate(Month = str_trim(Month)) %>% # 去掉前后空格 mutate(Month = ordered(Month, levels = month_levels)) %>% group_by(Month) %>% summarise(Average_Daffodil_Bulbs = mean(Daffodil_Bulbs, na.rm = TRUE))是月份缩写:转成全名再匹配
如果原始数据里是Jul这种缩写,用lubridate包的工具转成全名:library(dplyr) library(lubridate) month_levels = c('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December') Df_Average_Month <- MyDf %>% # 把缩写转成完整的月份名称 mutate(Month = month(parse_date_time(Month, "%b"), label = TRUE, abbr = FALSE)) %>% mutate(Month = ordered(Month, levels = month_levels)) %>% group_by(Month) %>% summarise(Average_Daffodil_Bulbs = mean(Daffodil_Bulbs, na.rm = TRUE))
最后提醒你
转成有序因子之前,一定要确保原始数据的每个Month值都能在month_levels里找到完全精确的匹配——差一个空格、一个大小写,都会被当成不匹配的取值,直接变成NA。另外你之前的代码里group_by之后的summarise部分没写完,可别忘了加上计算均值的步骤哦!
备注:内容来源于stack exchange,提问作者Alice Hobbs
相关产品推荐
相关产品推荐

