R语言 处理缺失数据
在数据科学中,常见的任务之一是处理缺失数据。如果我们在你的数据集中有缺失的数据,在R编程中有几种方法来处理它。一种方法是简单地删除包含缺失数据的任何行或列。另一种处理缺失数据的方法是使用统计学方法对缺失值进行估算。这意味着用基于数据集中其他数值的估计值来替换缺失的数值。例如,我们可以用发现缺失值的变量的平均值或中位数来替换缺失值。
缺失的数据
在R语言中,NA符号被用来定义缺失值,而为了表示不可能的算术运算(比如除以0),我们使用NAN符号,它代表 “不是一个数字”。简单地说,我们可以说NA或NAN符号都代表R语言中的缺失值。
让我们考虑这样一个场景:一位老师正在将所有学生的分数(或数据)插入电子表格。但由于失误,她忘记了插入班上一个学生的数据。因此,缺失的数据/值具有实用性。
寻找R中的缺失数据
R为我们提供了内置的函数,我们可以利用这些函数找到缺失的值。下面将详细解释这些内置函数。
使用is.na()函数
我们可以使用R中的is.na()内置函数来检查NA值。这个函数返回一个只包含逻辑值的向量(真或假)。对于原始数据集中的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"
让我们来找找新移民
# finding NAs
myVector <- c(NA, "TP", 4, 6.7, 'c', NA, 12)
is.na(myVector)
输出
[1] TRUE FALSE FALSE FALSE FALSE TRUE FALSE
让我们来识别Vector中的NAA
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值。该函数返回一个包含逻辑值(真或假)的向量。如果矢量中存在一些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语言中,我们有两种方法来移除缺失的数值。这些方法解释如下 –
使用过滤器功能删除数值
从数据集中去除缺失值的第一个方法是使用R的建模函数。这些函数接受一个na.action参数,让函数在遇到NA值的情况下做什么。这使得建模函数调用其缺失值过滤函数中的一个。
这些函数足以用一个新的数据集替换原始数据集,其中的NA值已经被改变。它的默认设置为na.省略,如果某行包含任何缺失值,则完全删除该行。
它只是在遇到任何缺失值时就终止。
- na.省略 – 它简单地排除了包含任何缺失值的任何行,并永远忘记了这些行。
-
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值,其对应的值为真,对于给定向量中的其他值,其对应的值为假。
示例
让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步 功能。
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中处理缺失数据。我们从讨论缺失值开始,寻找缺失值,删除缺失值,最后我们看到了通过平均数和中位数填充缺失值的方法。我们希望这个教程能帮助你提高你在数据科学领域的知识。