在 R 中处理缺失数据


在数据科学中,处理缺失数据是一项常见任务。如果您的数据集中存在**缺失数据**,则可以使用多种方法在**R**编程中处理它。一种方法是简单地删除包含缺失数据的任何行或列。另一种处理缺失数据的方法是使用统计方法来插补缺失值。这意味着用基于数据集中其他值 的估计值替换缺失值。例如,我们可以用找到缺失值的变量的平均值或中位数替换缺失值。

缺失数据

在 R 中,**NA** 符号用于定义缺失值,而对于表示不可能的算术运算(例如除以零),我们使用 NAN 符号,它代表“非数字”。简单来说,我们可以说 NA 或**NAN** 符号都表示 R 中的缺失值。

让我们考虑这样一种情况:一位老师正在将所有学生的成绩(或数据)插入电子表格中。但由于疏忽,她忘记了插入班上一个学生的成绩。因此,缺失数据/值在本质上是实际存在的。

在 R 中查找缺失数据

R 为我们提供了内置函数,我们可以使用这些函数来查找缺失值。下面详细解释了这些内置函数。

使用 is.na() 函数

我们可以在 R 中使用**is.na()**内置函数来检查 NA 值。此函数返回一个仅包含逻辑值(True 或 False)的向量。对于原始数据集中 NA 值,相应的向量值应为 True,否则应为 False。

示例

# vector with some data
myVector <- c(NA, "TP", 4, 6.7, 'c', NA, 12)
myVector

输出

[1] NA    "TP"  "4"   "6.7" "c"   NA    "12" 

让我们查找 NA 值

# finding NAs
myVector <- c(NA, "TP", 4, 6.7, 'c', NA, 12)
is.na(myVector)

输出

[1]  TRUE FALSE FALSE FALSE FALSE  TRUE FALSE

让我们在向量中识别 NA 值

myVector <- c(NA, "TP", 4, 6.7, 'c', NA, 12)
which(is.na(myVector))

输出

[1] 1 6

让我们识别 NA 值的总数。

myVector <- c(NA, "TP", 4, 6.7, 'c', NA, 12)
sum(is.na(myVector))

输出

[1] 2

正如您在输出中看到的,此函数生成一个向量,在 myVector 包含 NA 值的位置具有 True 布尔值。

使用 is.nan() 函数

我们可以应用**is.nan()**函数来检查**NAN**值。此函数返回一个包含逻辑值(True 或 False)的向量。如果向量中存在一些 NAN 值,则它将返回对应于该向量位置的 True,否则返回 False。

示例

myVector <- c(NA, 100, 241, NA, 0 / 0, 101, 0 / 0)

is.nan(myVector)

输出

[1] FALSE FALSE FALSE FALSE  TRUE FALSE  TRUE

正如您在输出中看到的,此函数生成一个向量,在 myVector 包含 NAN 值的位置具有 True 布尔值。

缺失值的一些特征如下所示。

  • 一个向量中可以存在多个 NA 或 NAN 值。

  • 要处理向量中 NA 类型的缺失值,我们可以使用 is.na() 函数,并将向量作为参数传递。

  • 要处理向量中 NAN 类型的缺失值,我们可以使用 is.nan() 函数,并将向量作为参数传递。

  • 通常,NAN 值可以包含在 NA 类型中,但反之则不成立。

删除缺失数据/值

让我们考虑这样一种情况:我们想要过滤除缺失值之外的值。在 R 中,我们有两种方法可以删除缺失值。下面解释了这些方法。

使用 Filter 函数删除值

从数据集中删除缺失值的第一种方法是使用 R 的建模函数。这些函数接受一个 na.action 参数,该参数允许函数在遇到 NA 值时执行的操作。这使得建模函数调用其缺失值过滤器函数之一。

这些函数能够用一个新数据集替换原始数据集,在该新数据集中,NA 值已更改。它的默认设置为 na.omit,如果此行包含任何缺失值,则完全删除一行。此设置的替代方案是:

每当遇到任何缺失值时,它就会终止。以下是过滤器函数:

  • **na.omit** - 它只是排除包含任何缺失值的任何行,并永远忘记这些行。

  • **na.exclude** - 此参数忽略至少包含一个缺失值的行。

  • **na.pass** - 不执行任何操作。

  • **na.fail** - 如果找到任何缺失值,则终止执行。

示例

myVector <- c(NA, "TP", 4, 6.7, 'c', NA, 12)
na.exclude(myVector)

输出

[1] "TP"  "4"   "6.7" "c"   "12" 
attr(,"na.action")
[1] 1 6
attr(,"class")
[1] "exclude"

示例

myVector <- c(NA, "TP", 4, 6.7, 'c', NA, 12)
na.omit(myVector)

输出

[1] "TP"  "4"   "6.7" "c"   "12" 
attr(,"na.action")
[1] 1 6
attr(,"class")
[1] "omit"

示例

myVector <- c(NA, "TP", 4, 6.7, 'c', NA, 12)
na.fail(myVector)

输出

Error in na.fail.default(myVector) : missing values in object

正如您在输出中看到的,对于至少包含一个缺失值的行,执行已停止。

选择不是 NA 或 NAN 的值

为了仅选择那些不是缺失的值,首先我们需要生成一个逻辑向量,其中对于给定向量中的 NA 或 NAN 值,对应值应为 True,对于其他值应为 False。

示例

令 logicalVector 为这样的向量(我们可以通过应用 is.na() 函数轻松获取此向量)。

myVector1 <- c(200, 112, NA, NA, NA, 49, NA, 190)
logicalVector1 <- is.na(myVector1)
newVector1 = myVector1[! logicalVector1]
print(newVector1)

输出

[1] 200 112  49 190

应用 is.nan() 函数

myVector2 <- c(100, 121, 0 / 0, 123, 0 / 0, 49, 0 / 0, 290)
logicalVector2 <- is.nan(myVector2)
newVector2 = myVector2[! logicalVector2]
print(newVector2)

输出

[1] 100 121 123  49 290

正如您在输出中看到的,NA 和 NAN 类型的缺失值已分别从 myVector1 和 myVector2 中成功删除。

用平均值或中位数填充缺失值

在本节中,我们将了解如何使用平均值和中位数填充或填充数据集中缺失的值。我们将使用 apply 方法获取缺失列的平均值和中位数。

**步骤 1** - 第一步是获取至少包含一个缺失值(NA)值的列列表。

示例

# Create a data frame
dataframe <- data.frame( Name = c("Bhuwanesh", "Anil", "Jai", "Naveen"),
   Physics = c(98, 87, 91, 94),
   Chemistry = c(NA, 84, 93, 87),
   Mathematics = c(91, 86, NA, NA) )
#Print dataframe
print(dataframe)

输出

       Name   Physics Chemistry Mathematics
1 Bhuwanesh        98        NA          91
2      Anil        87        84          86
3       Jai        91        93          NA
4    Naveen        94        87          NA

让我们打印至少包含一个 NA 值的列名。

listMissingColumns <- colnames(dataframe)[ apply(dataframe, 2, anyNA)]
print(listMissingColumns)

输出

[1] "Chemistry"   "Mathematics"

在我们的数据框中,我们有两列包含 NA 值。

**步骤 2** - 现在我们需要计算相应列的平均值和中位数。由于我们需要在缺失列中省略 NA 值,因此,我们可以将**"na.rm = True"**参数传递给**apply()**函数。

meanMissing <- apply(dataframe[,colnames(dataframe) %in% listMissingColumns], 
   2, mean, na.rm =  TRUE)
print(meanMissing)

输出

Chemistry Mathematics 
   88.0          88.5 

化学列的平均值为 88.0,数学列的平均值为 88.5。

现在让我们找到列的中位数。

medianMissing <- apply(dataframe[,colnames(dataframe) %in% listMissingColumns], 
   2, median, na.rm =  TRUE)

print(medianMissing)

输出

Chemistry Mathematics 
87.0        88.5 

化学列的中位数为 87.0,数学列的中位数为 88.5。

**步骤 3** - 现在我们已准备好相应列的平均值和中位数。在此步骤中,我们将使用“dplyr”包中定义的 mutate() 函数用平均值和中位数替换 NA 值。

示例

# Importing library
library(dplyr)

# Create a data frame
dataframe <- data.frame( Name = c("Bhuwanesh", "Anil", "Jai", "Naveen"),
   Physics = c(98, 87, 91, 94),
   Chemistry = c(NA, 84, 93, 87),
   Mathematics = c(91, 86, NA, NA) )

listMissingColumns <- colnames(dataframe)[ apply(dataframe, 2, anyNA)]

meanMissing <- apply(dataframe[,colnames(dataframe) %in% listMissingColumns], 
   2, mean, na.rm =  TRUE)

medianMissing <- apply(dataframe[,colnames(dataframe) %in% listMissingColumns], 
   2, median, na.rm =  TRUE)

newDataFrameMean <- dataframe %>% mutate(
   Chemistry = ifelse(is.na(Chemistry), meanMissing[1], Chemistry),
   Mathematics = ifelse(is.na(Mathematics), meanMissing[2], Mathematics))

newDataFrameMean

输出

       Name    Physics Chemistry Mathematics
1 Bhuwanesh         98        88        91.0
2      Anil         87        84        86.0
3       Jai         91        93        88.5
4    Naveen         94        87        88.5

请注意,缺失值已填充为相应列的平均值。

示例

现在让我们用相应列的中位数填充 NA 值。

# Importing library
library(dplyr)

# Create a data frame
dataframe <- data.frame( Name = c("Bhuwanesh", "Anil", "Jai", "Naveen"),
   Physics = c(98, 87, 91, 94),
   Chemistry = c(NA, 84, 93, 87),
   Mathematics = c(91, 86, NA, NA) )

listMissingColumns <- colnames(dataframe)[ apply(dataframe, 2, anyNA)]

meanMissing <- apply(dataframe[,colnames(dataframe) %in% listMissingColumns], 
   2, mean, na.rm =  TRUE)

medianMissing <- apply(dataframe[,colnames(dataframe) %in% listMissingColumns], 
   2, median, na.rm =  TRUE)

newDataFrameMedian <- dataframe %>% mutate( 
   Chemistry = ifelse(is.na(Chemistry), medianMissing[1], Chemistry),
   Mathematics =  ifelse(is.na(Mathematics), medianMissing[2],Mathematics))

print(newDataFrameMedian)

输出

       Name  Physics Chemistry Mathematics
1 Bhuwanesh      98        87         91.0
2      Anil      87        84         86.0
3       Jai      91        93         88.5
4    Naveen      94        87         88.5

缺失值已填充为相应列的中位数。

结论

在本教程中,我们讨论了如何在 R 中处理缺失数据。我们从关于缺失值的讨论开始,然后是查找缺失值、删除缺失值,最后我们看到了用平均值和中位数填充缺失值的方法。我们希望本教程能帮助您提高数据科学领域的知识。

更新于:2023 年 1 月 17 日

28K+ 浏览量

启动您的 职业生涯

通过完成课程获得认证

开始学习
广告