You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将月份名称转为数字时如何避免‘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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 17:25:20