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
相关产品推荐
相关产品推荐

