将月份名称转为数字时如何避免‘must be size’错误?
问题原因分析
你的代码在示例1能运行纯属巧合,核心逻辑存在问题:
- 内置的
month.name是长度为12的月份名称向量。当你在group_by(Month)后的组内,用整个组的Month向量(比如示例2中31个"August")和month.name比较时,R会触发向量循环规则:将较短的向量重复,直到长度与较长的向量一致。 - 示例1中,每个组的行数都是2,
month.name(长度12)会被重复6次变成12个元素,和重复6次的Month向量比较后,只有1个TRUE值,which()返回长度为1的结果,R会自动将这个值循环填充到组内所有行,所以没有报错。 - 示例2中,"August"组有31行,
month.name重复3次后取前31个元素,其中第8位(第一次循环的"August")和第20位(第二次循环的"August")会匹配成功,which()返回长度为2的结果,而组内需要31个元素来填充,长度不匹配,因此触发报错:"Month must be size 31 or 1, not 2."
正确解法
不需要复杂的分组操作,直接用match()函数即可完成月份名称到数字的转换,该函数能对向量中的每个元素返回其在month.name中的位置:
df %>% mutate(Month = match(Month, month.name))
如果坚持使用分组逻辑,也可以在组内取单个月份值进行匹配,确保返回结果为单个数字,自动填充整个组:
df %>% group_by(Month) %>% mutate(Month = which(month.name == first(Month))) %>% ungroup() # 可选,根据后续操作需求决定是否取消分组
内容的提问来源于stack exchange,提问作者marc.th
相关产品推荐
相关产品推荐

