在 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+ 瀏覽量

啟動您的 職業生涯

透過完成課程獲得認證

開始學習
廣告