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