R语言sum()无缺失值全数值数据行求和结果为0问题排查
错误原因
你的代码有2个核心问题,直接导致求和结果异常:
- 你没有正确引用数据框中的列:传给
sum()的是带双引号的列名字符串,不是列里存储的实际数值。注意:包含空格、方括号等特殊字符的列名,在tidyverse语法中需要用反引号(`)包裹引用,不能用双引号,双引号包裹的内容会被识别为普通文本字符串,而非列名。as.numeric()处理纯文本列名时,因为文本无法转换为合法数值,会返回NA,配合na.rm = TRUE参数移除所有NA后,求和结果自然为0。 - 管道执行的修改没有赋值回原对象:你用
%>%执行逐行计算、新增列的操作后,没有将结果重新赋值给df_structure,原始数据框并没有被修改,后续直接调用summary(df_structure$sum_emissions)本身就会因为找不到列报错。 - 补充说明:你给出的示例数据中仅包含4个排放相关列,和你描述的“5个变量求和”不符,实际使用时请补全所有需要计算的列即可。
正确实现方式
写法1:保留原有的逐行计算逻辑
dplyr的rowwise()模式下,需要用c_across()批量选取行内的列值:
library(dplyr) df_structure <- df_structure %>% rowwise() %>% mutate( sum_emissions = sum( c_across(c( `Particeles_PM10_[kg]_WTW_whole transport chain`, `SO2_[kg]_WTW_whole transport chain`, `NOX_[kg]_WTW_whole transport chain`, `NMHC_[kg]_WTW_whole transport chain` )), na.rm = TRUE ) ) %>% ungroup() # 计算完成后解除行分组,避免后续操作异常 # 查看计算结果统计 summary(df_structure$sum_emissions)
写法2:更高效的向量化计算(推荐)
逐行rowwise()运算效率较低,对于整行求和的场景,用向量化的rowSums()运算速度更快,还可以通过列名匹配规则自动选列,不用手动输入所有长列名:
library(dplyr) df_structure <- df_structure %>% mutate( # 匹配所有后缀为WTW_whole transport chain的排放列自动纳入计算 sum_emissions = rowSums(across(ends_with("WTW_whole transport chain")), na.rm = TRUE) ) summary(df_structure$sum_emissions)
运行以上代码后,就能得到正确的逐行总排放量结果,不会再出现全0的问题。
内容的提问来源于stack exchange,提问作者David Færgeman
相关产品推荐
相关产品推荐

