DevCN
菜单
全部文章快讯开发深度热点

R 入门:过滤缺失时长并计算有效记录均值

在数值向量中区分 NA、负数和合法零,通过显式筛选计算总和与均值,避免缺失值传播影响统计。


本节目标

在数值向量中区分 NA、负数和合法零,通过显式筛选计算总和与均值,避免缺失值传播影响统计。

环境与运行方法

准备 R 4.x,保存为 lesson.R,执行 Rscript lesson.R。只使用基础 R,不安装 tidyverse。示例用 cat 固定输出格式,便于直接核对结果。

核心思路

NA 表示缺失,不等于零。直接对含 NA 的向量求和或平均会传播缺失。先定义哪些记录有效,再筛选,比在所有函数里机械加 na.rm 更清楚。

完整示例

records <- c(20, NA_real_, -5, 35, 0)
valid <- records[!is.na(records) & records >= 0]
cat("valid=", length(valid), " total=", sum(valid), "\n", sep="")
cat("mean=", mean(valid), "\n", sep="")
empty <- numeric(0)
cat("empty_count=", length(empty), "\n", sep="")

预期输出

valid=3 total=55
mean=18.33333
empty_count=0

逐步理解

is.na 检查缺失,非负条件表达业务有效性。两者组合后,20、35、0 保留,均值分母为三,不是全部五条,也不是只有正数的两条。

均值的显示精度与数值内部精度不同,cat 的结果会受到显示参数影响。本例使用默认环境。空数值向量的 sum 为零,但 mean 会得到 NaN;界面应先检查数量,再决定显示暂无数据或其他明确提示。

常见问题与边界

  • 不能用 records==NA 判断缺失。
  • na.rm 只处理缺失,不会替你过滤负值。
  • 向量逻辑与标量逻辑运算符用途不同。

动手练习

把输入改为 c(0,0),再改为全 NA。

参考答案

两个零得到两条有效记录,均值零;全缺失得到空有效向量,不能把它的均值当成真实零。应先检查 length(valid) 是否为零。

DISCUSSION

文章回复

0 条公开回复
未登录回复需要审核后公开
还没有回复,欢迎参与讨论。