在 R 中用 0 代替 NA

Gustavo du Mortier 2023年1月30日
  1. 在較大的 R 資料框中用零代替 NA
  2. 在 R 資料框的子集中用零替換 NA
在 R 中用 0 代替 NA

在 R 中,有一個簡單的方法可以將資料框中的 NA 替換為 0。假設你有一個名為 my_data 的資料框。要將該資料框中所有的 NA 值用零代替,可以執行這條語句。

my_data[is.na(my_data)] <- 0

例如,如果 my_data 有以下內容。

   C1  C2    C3  C4  C5
1   4   3  <NA>   3   7
2   9   8   ABC   5  10
3   1   1   XYZ   3   6
4  NA   4  <NA>   7  10
5   1   2   ZC1  NA   2

當你執行 my_data[is.na(my_data)] <- 0 時,資料框的內容就會變成這樣。

   C1  C2    C3  C4  C5
1   4   3     0   3   7
2   9   8   ABC   5  10
3   1   1   XYZ   3   6
4   0   4     0   7  10
5   1   2   ZC1   0   2

在較大的 R 資料框中用零代替 NA

以前的解決方案使用 Base R 子集重分配,當你有相對較小的資料框時,它工作得很好。但對於更大的資料集,你可能需要一個更快的替代方案,比如最近版本的 dplyr 包中實現的新的混合評估方法。

dplyr 包採用的新方法可以識別整個表示式,並使用 C++ 程式碼來評估它們。這樣,在處理大資料框時,你可以實現高達 30%的變換速度。

要使用 dplyr 包將 NA 值替換為零,可以使用 mutate 函式與 _all 範圍內的動詞和 replace 函式的 purrr 格式,如下例所示。

my_data <- mutate_all(my_data, ~replace(., is.na(.), 0))

使用 purrr 符號允許我們將 replace 函式應用於每個資料框元素。

在 R 資料框的子集中用零替換 NA

mutate 函式中,你可以使用 _at 範圍動詞來代替 _all 範圍動詞,將替換操作限制在特定的列上。要做到這一點,你可以包含一個包含列名的向量,這是你希望替換髮生的地方。使用前面的資料框,如果你只需要替換列 C1C4 中的 NA 值,你可以使用以下命令。

my_data <- mutate_at(my_data, c(`C1`, `C4`), ~replace(., is.na(.), 0))

這樣一來,只有列 C1C4 中的 NA 值被替換為 0,從而得到如下資料框。

   C1  C2    C3  C4  C5
1   4   3  <NA>   3   7
2   9   8   ABC   5  10
3   1   1   XYZ   3   6
4   0   4  <NA>   7  10
5   1   2   ZC1   0   2

在前面的例子中,你可能希望只在數字列中用 0 來替換 NA,以避免在字母數字列(如 C3)中包含 0 值。如果是這種情況,你可以使用 mutate_if 函式和 is.numeric 條件來告訴 R 只在數字列中用零值替換 NA,而不是指定要應用替換的列。在下面的例子中,你可以找到完整的程式碼來嘗試,從安裝 dplyr 包、填充資料框到執行替換並顯示結果。

install.packages("dplyr")
library(dplyr)
C1 <- c(4, 9, 1, NA, 1)
C2 <- c(3, 8, 1, 4, 2)
C3 <- c(NA, 'ABC', 'XYZ', NA, 'ZC1')
C4 <- c(3, 5, 3, 7, NA)
C5 <- c(7, 10, NA, 10, 2)
my_data <- data.frame(C1, C2, C3, C4, C5)
my_data <- mutate_if(my_data, is.numeric, ~replace(., is.na(.), 0))
my_data

輸出:

   C1  C2    C3  C4  C5
1   4   3  <NA>   3   7
2   9   8   ABC   5  10
3   1   1   XYZ   3   0
4   0   4  <NA>   7  10
5   1   2   ZC1   0   2

你可以在 R 文件中找到更多關於 mutate() 函式及其變體的資訊。

相關文章 - R Data Frame