检测并统计缺失值
使用 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 的位置为 TRUEanyNA(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)可以快速检查是否存在 NAwhich(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 反馈 — 无需本地设置。
此课程中的所有课时
- 理解 R 中的 NA
- 检测并统计缺失值
- 移除与替换 NA 值
- 计算与聚合中的 NA