You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

R语言计算Lahman数据库棒球数据总垒数报错:非数值参数参与二元运算

解决Lahman棒球数据总垒数(TB)计算的错误问题

嘿,我一眼就瞅出问题所在了——你把字段名用双引号括起来啦!当你在mutate里写"X2B"的时候,R会把它当成普通的字符串文本,而不是batting_1903数据框里的数值列,自然就会报错说“非数值参数用于二元运算符”,毕竟数字和字符串没法相乘嘛。

修正后的代码

我帮你调整了TB的计算逻辑(还简化了公式),同时去掉了不必要的引号:

batting_1960 <- batting_1903 %>%
  filter(yearID <= 1960 & G >= 90) %>%
  # 先确保所有用到的字段都是数值类型(可选但保险)
  mutate(across(c(X2B, X3B, HR, H, AB), as.numeric)) %>%
  mutate(
    Batting_Average = H / AB,
    # 简化的总垒数计算公式:一垒安打*1 + 二垒安打*2 + 三垒安打*3 + 本垒打*4
    # 等价于 H + X2B + 2*X3B + 3*HR(因为H包含所有安打,减去各长打后是一垒安打,乘以1加回去就是H)
    TB = H + X2B + 2*X3B + 3*HR,
    OBP = (H + BB + HBP) / (AB + BB + HBP + SF),
    Slugging = TB / AB,
    OPS = OBP + Slugging
  ) %>%
  arrange(yearID, desc(Batting_Average))

关键说明

  • 去掉字段名的引号:在dplyr的管道操作中,直接使用列名(比如X2B)就能引用数据框里的列,不需要加引号。
  • 简化TB的计算:原来的公式逻辑是对的,但简化后更易读,计算结果完全一致。
  • 数值类型检查:加上across(...)把关键字段转成数值类型,避免因为列类型是字符型导致的隐性错误(虽然Lahman数据库默认列类型应该是数值,但保险起见加上更好)。
  • 补充完整进攻指标:我顺便补上了OBP、Slugging和OPS的标准计算方式(如果你的数据里有BB、HBP、SF这些字段的话),要是没有可以删掉对应的部分。

这样修改后,代码应该就能正常运行,为每行数据生成正确的总垒数和其他进攻指标了!

内容的提问来源于stack exchange,提问作者R white

火山引擎 最新活动