在 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 中處理缺失資料。我們從關於缺失值的討論開始,然後是查詢缺失值、刪除缺失值,最後我們看到了用平均值和中位數填充缺失值的方法。我們希望本教程能幫助您提高資料科學領域的知識。