r - 使用列数不确定的 replace_na()
问题描述
我的数据框如下所示:
df <- tibble(x = c(1, 2, NA),
y = c(1, NA, 3),
z = c(NA, 2, 3))
我想使用 tidyr::replace_na() 将 NA 替换为 0。正如此函数的文档所明确指出的,一旦您知道要对哪些列执行操作,就很容易做到这一点。
df <- df %>% replace_na(list(x = 0, y = 0, z = 0))
但是,如果您有不确定的列数怎么办?(我说“不确定”是因为我正在尝试创建一个使用 dplyr 工具即时执行此操作的函数。)如果我没记错的话,与我使用上述工具尝试实现的基本 R 等效的是:
df[, 1:ncol(df)][is.na(df[, 1:ncol(df)])] <- 0
但我总是很难理解这段代码。在此先感谢您的帮助。
解决方案
我们可以通过list
根据数据集的列数创建一个 0 并使用列名设置名称来做到这一点
library(tidyverse)
df %>%
replace_na(set_names(as.list(rep(0, length(.))), names(.)))
# A tibble: 3 x 3
# x y z
# <dbl> <dbl> <dbl>
#1 1 1 0
#2 2 0 2
#3 0 3 3
或者另一个选项是mutate_all
(对于选定的列 -mutate_at
或基本不条件mutate_if
)并应用replace_all
df %>%
mutate_all(replace_na, replace = 0)
,base R
它更直接
df[is.na(df)] <- 0
推荐阅读
- hadoop - 大容量倾斜数据集上的 Hive 排序操作
- java - 通过 abs 方法返回负数
- java - 配置 bean 未初始化
- python - 如何在 VSCode 上安装新的 python 模块?
- openlayers - OpenLayers - 总览图上的不同风格
- java - Java 中的 ISO 8583 字段 116 示例
- rust - 使用 Rust std::process::Command 安装 NPM 包
- r - R Caret / SMOTE:无效标签:即使在将变量转换为数字因子之后,使用 SMOTE 的长度 0 也应为 1 或 2
- python - 接近 0.0 时的 Python 行为
- javascript - 监控阵列的变化