在 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
范围动词,将替换操作限制在特定的列上。要做到这一点,你可以包含一个包含列名的向量,这是你希望替换发生的地方。使用前面的数据框,如果你只需要替换列 C1
和 C4
中的 NA
值,你可以使用以下命令。
my_data <- mutate_at(my_data, c(`C1`, `C4`), ~replace(., is.na(.), 0))
这样一来,只有列 C1
和 C4
中的 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()
函数及其变体的信息。