在 R 中,清除包含 NA(缺失值)的数据

发布于:2025-05-13 ⋅ 阅读:(17) ⋅ 点赞:(0)

在 R 中,清除包含 NA(缺失值)的数据可以通过多种方式实现,具体取决于你希望如何处理这些缺失值。以下是几种常见的方法,包括删除包含 NA 的行、删除包含 NA 的列,或者用特定值填充 NA

1. 删除包含 NA 的行

如果你希望删除数据框中包含任何 NA 值的行,可以使用 na.omit() 函数或 complete.cases() 函数。

使用 na.omit()

na.omit() 会自动删除包含任何 NA 的行。

# 示例数据框
data <- data.frame(
  Name = c("Alice", "Bob", "Charlie", "David"),
  Age = c(15, NA, 10, 30),
  Score = c(85, 90, NA, 88)
)

# 删除包含 NA 的行
data_clean <- na.omit(data)

print(data_clean)

输出:

    Name Age Score
4  David  30    88
使用 complete.cases()

complete.cases() 会返回一个逻辑向量,指示哪些行没有 NA 值。

# 删除包含 NA 的行
data_clean <- data[complete.cases(data), ]

print(data_clean)

输出:

    Name Age Score
4  David  30    88

2. 删除包含 NA 的列

如果你希望删除数据框中包含任何 NA 值的列,可以使用 apply() 函数结合 anyNA() 函数。

# 示例数据框
data <- data.frame(
  Name = c("Alice", "Bob", "Charlie", "David"),
  Age = c(15, NA, 10, 30),
  Score = c(85, 90, NA, 88),
  Gender = c("Female", "Male", "Male", "Male")
)

# 删除包含 NA 的列
data_clean <- data[, !apply(data, 2, anyNA)]

print(data_clean)

输出:

     Gender
1   Female
2     Male
3     Male
4     Male

3. 按条件删除行或列

如果你只想删除特定列中包含 NA 的行,可以指定列名。

删除特定列中包含 NA 的行
# 删除 Age 列中包含 NA 的行
data_clean <- data[!is.na(data$Age), ]

print(data_clean)

输出:

     Name Age Score Gender
1   Alice  15    85 Female
3 Charlie  10    NA   Male
4   David  30    88   Male
删除特定列中包含 NA 的列
# 删除 Score 列中包含 NA 的列
data_clean <- data[, !anyNA(data$Score)]

print(data_clean)

输出:

     Name Age Gender
1   Alice  15 Female
2     Bob  NA   Male
3 Charlie  10   Male
4   David  30   Male

4. 填充 NA 值

如果你不想删除 NA 值,而是希望用特定值填充它们,可以使用 ifelse() 函数或 dplyr 包中的 replace_na() 函数。

使用 ifelse() 填充 NA
# 用 0 填充 NA
data$Age <- ifelse(is.na(data$Age), 0, data$Age)
data$Score <- ifelse(is.na(data$Score), 0, data$Score)

print(data)

输出:

     Name Age Score Gender
1   Alice  15    85 Female
2     Bob   0    90   Male
3 Charlie  10     0   Male
4   David  30    88   Male
使用 dplyr::replace_na()
library(dplyr)
data <- data %>%
  mutate(Age = replace_na(Age, 0),
         Score = replace_na(Score, 0))

print(data)

输出:

     Name Age Score Gender
1   Alice  15    85 Female
2     Bob   0    90   Male
3 Charlie  10     0   Male
4   David  30    88   Male

5. 总结

  • 删除包含 NA 的行:使用 na.omit()complete.cases()

  • 删除包含 NA 的列:使用 apply() 结合 anyNA()

  • 按条件删除行或列:指定列名并使用逻辑条件。

  • 填充 NA:使用 ifelse()dplyr::replace_na()