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

R语言数值列调用rowSums报'x' must be numeric错误排查

报错原因

这个报错是sf空间对象和普通data.frame的子集规则差异导致的,和选中的4个列本身的类型无关:

  • 普通data.frame执行df[,19:22]时,只会返回选中的4列;但sf对象的[索引方法默认会强制保留sfc格式的空间几何列,无论你选的属性列是否包含几何列,返回结果都会自动带上这个列。
  • sfc几何列是存储空间坐标、拓扑信息的列表类型列,不属于数值类型。你传给rowSums()的对象实际包含「4个整数类型的目标列 + 1个列表类型的几何列」,函数碰到非数值列时就会抛出'x' must be numeric的错误。
  • 你通过str(STTH)查看原对象的19-22列确实都是int类型,但没有检查索引后传给rowSums()的子对象结构,因此忽略了多出来的非数值几何列。
修正方法

以下方案均可直接运行,按稳妥度排序:

  • 方案1(最推荐):计算前先用st_drop_geometry()剥离几何列,把sf对象转成普通data.frame再计算,完全避开sf特殊子集规则的影响。如果代码需要长期复用,优先用列名代替列位置索引,避免后续列顺序变动导致计算错误:
# 用列位置索引
STTH$projectsum <- rowSums(
  st_drop_geometry(STTH)[,19:22], 
  na.rm = TRUE
)

# 更稳妥的列名索引写法
STTH$projectsum <- rowSums(
  st_drop_geometry(STTH)[,c("base_ST_funding", "base_stlandowner_funding", "base__section6", "base_partners")],
  na.rm = TRUE
)
  • 方案2:用dplyr语法选列计算,dplyr行内运算不会自动携带几何列参与计算:
library(dplyr)
STTH <- STTH %>%
  mutate(
    projectsum = rowSums(pick(19:22), na.rm = TRUE)
  )
  • 方案3:索引列时显式声明丢弃几何列,该参数为sf对象[方法独有:
STTH$projectsum <- rowSums(
  STTH[,19:22, drop = TRUE], 
  na.rm = TRUE
)

排错提示:如果不确定子集返回的列是否符合预期,可以在计算前执行colnames(STTH[,19:22]),就能看到返回结果里确实包含几何列,和普通data.frame的索引结果对比可以直观看出规则差异。

内容的提问来源于stack exchange,提问作者Ryan Gary

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 14:21:21