在 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 类型中,但反之则不成立。
Explore our latest online courses and learn new skills at your own pace. Enroll and become a certified expert to boost your career.
删除缺失数据/值
让我们考虑这样一种情况:我们想要过滤除缺失值之外的值。在 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 中处理缺失数据。我们从关于缺失值的讨论开始,然后是查找缺失值、删除缺失值,最后我们看到了用平均值和中位数填充缺失值的方法。我们希望本教程能帮助您提高数据科学领域的知识。