0Pricing
R Academy · 课时

检测并统计缺失值

使用 is.na()、anyNA() 和 sum(is.na()) 检查缺失数据

检测并统计缺失值 是 CoddyKit 上的免费 R Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 R Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 R Academy 课程共包含 4 节课。

is.na() — 核心检测工具

is.na(x) 会检查 x 的每个元素,并返回一个长度相同的逻辑向量;值为 NA(或 NaN)的位置返回 TRUE。这是检测缺失值的基础工具。

heights <- c(175, NA, 162, 188, NA, 170, NA, 165)
cat('Heights:', heights, '
')
cat('is.na() :', is.na(heights), '
')
cat('!is.na():', !is.na(heights), '
')

使用 sum(is.na()) 统计 NA

由于在算术运算中 TRUE == 1 且 FALSE == 0,因此 sum(is.na(x)) 可以统计缺失值的总数。mean(is.na(x)) 则会给出缺失值的比例。

survey <- c(8, NA, 6, NA, 9, 7, NA, 5, NA, 8)
cat('Survey responses:', survey, '
')
cat('Total NAs:    ', sum(is.na(survey)), '
')
cat('Total present:', sum(!is.na(survey)), '
')
cat('NA proportion:', mean(is.na(survey)), '
')
cat('NA percentage:', mean(is.na(survey)) * 100, '%
')

anyNA() — 快速检查是否存在

如果 x 的任意元素为 NA,anyNA(x) 就会返回一个 TRUE,否则返回 FALSE。它比 any(is.na(x)) 更快,因为找到第一个 NA 后就会停止。

complete_data <- c(1, 2, 3, 4, 5)
incomplete_data <- c(1, 2, NA, 4, 5)

cat('anyNA(complete)  :', anyNA(complete_data), '
')    # FALSE
cat('anyNA(incomplete):', anyNA(incomplete_data), '
')  # TRUE

# Use in validation
if (anyNA(incomplete_data)) {
  cat('Warning: data contains missing values!
')
}

which(is.na()) — 查找位置

which(is.na(x)) 会返回向量中缺失值的索引(位置)。这对于审查哪些观测缺失以及进行有针对性的插补至关重要。

temperatures <- c(22.1, NA, 19.8, NA, 25.1, NA, 17.3, 20.0)
cat('Temperatures:', temperatures, '
')

missing_pos <- which(is.na(temperatures))
cat('Missing at positions:', missing_pos, '
')
cat('Number missing:', length(missing_pos), '
')

# What values are NOT missing?
present_pos <- which(!is.na(temperatures))
cat('Present at positions:', present_pos, '
')

统计数据框中的 NA

对于数据框,is.na(df) 会返回一个维度相同的逻辑矩阵。将其与 colSums() 结合使用,可以得到每列的缺失值数量,这是快速审查数据质量的方法。

# Simulate a small data frame
name_col <- c('Alice', 'Bob', 'Carol', 'Dave', 'Eve')
age_col  <- c(28, NA, 32, NA, 29)
sal_col  <- c(55000, 72000, NA, 90000, 61000)
scr_col  <- c(88, NA, 75, NA, NA)

cat('Age NAs:   ', sum(is.na(age_col)), '
')
cat('Salary NAs:', sum(is.na(sal_col)), '
')
cat('Score NAs: ', sum(is.na(scr_col)), '
')

colSums(is.na(df)) 模式

colSums(is.na(df)) 模式是统计数据框每列缺失值数量的最快方法。它会返回一个带名称的数值向量,显示每列包含多少个 NA。

# Build a data frame manually
df <- data.frame(
  name   = c('Alice', 'Bob', 'Carol', 'Dave', 'Eve'),
  age    = c(28, NA, 32, NA, 29),
  salary = c(55000, 72000, NA, 90000, 61000),
  score  = c(88, NA, 75, NA, NA)
)
cat('Missing values per column:
')
print(colSums(is.na(df)))
cat('Total missing:', sum(is.na(df)), '
')

每列 NA 的比例

除以行数即可得到每列缺失值的比例。当各列长度不同时,这比原始数量更有参考价值。

df <- data.frame(
  x1 = c(1, NA, 3, NA, 5),
  x2 = c(NA, 2, NA, 4, NA),
  x3 = c(1, 2, 3, NA, 5)
)
n_rows <- nrow(df)
na_counts <- colSums(is.na(df))
na_pct <- round(na_counts / n_rows * 100, 1)

cat('NA counts:     '); print(na_counts)
cat('NA percentage: '); print(na_pct)

table(is.na()) — 频数统计

table(is.na(x)) 会生成一个带名称的频数表,显示 FALSE(存在)和 TRUE(缺失)值各有多少个。结果一目了然。

responses <- c(5, NA, 8, 6, NA, 9, 7, NA, NA, 8)

cat('NA frequency table:
')
print(table(is.na(responses)))

# For multiple columns:
cat('Age table:
')
ages <- c(28, NA, 32, NA, 29)
print(table(is.na(ages)))

查找包含任意 NA 的行

要查找数据框中至少包含一个缺失值的行,请使用 apply(is.na(df), 1, any)。结果是一个逻辑向量,不完整的行对应 TRUE。

df <- data.frame(
  id     = 1:5,
  age    = c(28, NA, 32, NA, 29),
  salary = c(55000, 72000, NA, 90000, 61000)
)

# Which rows have at least one NA?
has_na <- apply(is.na(df), 1, any)
cat('Rows with any NA:', which(has_na), '
')
cat('Complete rows:   ', which(!has_na), '
')
cat('Complete row count:', sum(!has_na), '/', nrow(df), '
')

审查完整数据集

实用的 NA 审查流程是:统计、定位并报告缺失值,以便在分析前了解数据质量。下面是一个自包含的审查函数。

audit_na <- function(v, label) {
  n_total   <- length(v)
  n_missing <- sum(is.na(v))
  pct       <- round(n_missing / n_total * 100, 1)
  positions <- which(is.na(v))
  cat(label, ':', n_missing, '/', n_total,
      '(', pct, '%) NA at positions', positions, '
')
}

heights <- c(175, NA, 162, 188, NA, 170)
weights <- c(70, 85, NA, 92, 68, NA)
audit_na(heights, 'Height')
audit_na(weights, 'Weight')

NA 检测工具总结

NA 检测工具速查:

  • is.na(x) — 逻辑向量:NA 的位置为 TRUE
  • anyNA(x) — 单个 TRUE/FALSE:是否存在 NA?
  • sum(is.na(x)) — NA 的数量
  • mean(is.na(x)) — NA 的比例
  • which(is.na(x)) — NA 的位置
  • colSums(is.na(df)) — 每列的 NA 数量
  • table(is.na(x)) — NA/非 NA 的频数表
x <- c(10, NA, 30, NA, 50, NA, 70)
cat('is.na:       ', is.na(x), '
')
cat('anyNA:       ', anyNA(x), '
')
cat('sum(is.na):  ', sum(is.na(x)), '
')
cat('mean(is.na): ', mean(is.na(x)), '
')
cat('which(is.na):', which(is.na(x)), '
')

快速检查

sum(is.na(c(1, NA, 3, NA, 5))) 会返回什么?

回顾:检测和统计 NA

做得很好!本课的要点如下:

  • is.na(x) 是主要工具——返回一个逻辑向量
  • sum(is.na(x)) 统计缺失值数量;mean(is.na(x)) 给出缺失值比例
  • anyNA(x) 可以快速检查是否存在 NA
  • which(is.na(x)) 显示 NA 的确切位置
  • colSums(is.na(df)) 是审查数据框的标准方法
  • 绝不要使用 x == NA 检测 NA——始终使用 is.na(x)
# Full audit of a data frame in 3 lines
df <- data.frame(a=c(1,NA,3), b=c(NA,2,NA), c=c(1,2,3))
cat('Per column:', colSums(is.na(df)), '
')
cat('Total:     ', sum(is.na(df)), '/', nrow(df)*ncol(df), '
')
cat('Complete rows:', sum(complete.cases(df)), '/', nrow(df), '
')

常见问题解答

「检测并统计缺失值」课时是免费的吗?

是的 — 「检测并统计缺失值」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 R Academy 课程的其余内容,请升级到 CoddyKit PRO。 R Academy 课程共包含 4 节课。

「检测并统计缺失值」这节课中我会学到什么?

使用 is.na()、anyNA() 和 sum(is.na()) 检查缺失数据 你通过在浏览器中直接运行的动手代码来练习 R Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 R Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 R Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「检测并统计缺失值」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 R Academy 课中编写并运行代码吗?

能。每节 R Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 理解 R 中的 NA
  2. 检测并统计缺失值
  3. 移除与替换 NA 值
  4. 计算与聚合中的 NA
← 返回 R Academy