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

R语言求助:将NA视为0计算24小时平均值的实现问题

解决将data.frame中NA视为0计算24小时平均值的问题

你遇到的核心问题是对mean()函数的na.rm参数理解有误:na.rm=FALSE是R的默认行为——只要向量中存在NA,计算结果就会返回NA,而非把NA当作0处理。要实现将NA视为0、除数固定为24的平均值,必须先显式把NA替换为0,再计算均值。

解决方案

方法1:基础R(apply+NA替换)

先提取所有小时列,再对每行的NA替换为0后计算均值:

# 自动提取所有以hour_开头的列,避免手动输入列名
hour_cols <- grep("^hour_", names(data), value = TRUE)

# 计算average2:替换NA为0后求均值
data$average2 <- apply(data[, hour_cols], 1, function(x) {
  x[is.na(x)] <- 0
  mean(x)
})

方法2:用rowMeans简化代码

rowMeans可直接对行计算均值,结合replace函数批量替换NA为0:

hour_cols <- grep("^hour_", names(data), value = TRUE)
data$average2 <- rowMeans(replace(data[, hour_cols], is.na(data[, hour_cols]), 0))

方法3:tidyverse/dplyr风格(适合数据清洗场景)

如果习惯用tidyverse工具链,可通过replace_na替换NA后计算行均值:

library(dplyr)
library(tidyr)

data <- data %>%
  # 将所有小时列的NA替换为0
  mutate(across(starts_with("hour_"), ~replace_na(., 0))) %>%
  # 计算24小时均值
  mutate(average2 = rowMeans(across(starts_with("hour_"))))

关键说明

  • na.rm=TRUE的作用是忽略NA,用非NA值的数量作为除数(比如某行有20个非NA值,就用总和除以20);
  • 若要将NA视为0,必须先替换NA为0,此时所有行都是24个数值,均值自然是总和除以24。

内容的提问来源于stack exchange,提问作者Kelly Ireland

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 10:34:52