如何将特定列中的 NA 值替换为 0?

问题描述 投票:0回答:1

我正在处理一个大型数据集,其中有 3 列具有 NA 值,我需要将其中 2 列中的 NA 值替换为 0,但将第三列保留为 NA,以忽略第三列中具有 NA 的那些行他们的价值。我只需要省略一列中的 NA,因为我将该数据用于分布图,并且 NA 值扰乱了轴缩放。

为了清楚起见,我已将代码中实际使用的列名称替换为 keep_NA、replace_NA1 和 Replace_NA2。我需要替换的列是 int 类型,而 keep 是 num 类型。

我尝试使用 na.omit() 引用列:

library(tidyverse)
library(knitr)
d <- read.csv(...)
d_clean <- na.omit(d$omit_NA)

这会生成一个 d_clean,它会忽略所有列中具有 NA 值的所有行。我也试过这样:

d_clean <- d %>%
    mutate(na.omit(d$omit_NA))

产生与第一个代码块相同的 d_clean。然后我尝试在复制数据后使用 na.omit() 替换 d_clean 数据框中的 NA:

d_clean <- d
d_clean[is.na(d_clean$replace_NA1)] <- 0
d_clean[is.na(d_clean$replace_NA2)] <- 0
na.omit(d_clean)

它没有替换或省略任何 NA 值,给我一个与 d 相同的 d_clean 并给出了这个错误:

[<-.data.frame
(
*tmp*
, is.na(d_clean$replace_NA1), value = 0) 中的错误: 列的重复下标

我知道这是因为我使用了 d_clean$ 但当我在不调用数据框的情况下尝试它时,它说找不到对象。我做错了什么以及如何解决它?

r dataframe
1个回答
0
投票

在两列 sub-df 上创建索引,并使用它为

NA
分配零。

# repl can be 2:3 or
repl <- c("replace_NA1", "replace_NA2")
df1[repl] |> is.na() -> i
df1[repl][i] <- 0L

创建于 2024 年 11 月 5 日,使用 reprex v2.1.1

或者,假设列向量已经在一个代码行中创建。

repl <- c("replace_NA1", "replace_NA2")
df1[repl][ is.na(df1[repl]) ] <- 0L

创建于 2024 年 11 月 5 日,使用 reprex v2.1.1


测试数据

df1 <- matrix(1:60, ncol = 3, dimnames = list(NULL, c("keep_NA", "replace_NA1", "replace_NA2")))
is.na(df1) <- sample(60, 20)
df1 <- as.data.frame(df1)

创建于 2024 年 11 月 5 日,使用 reprex v2.1.1

© www.soinside.com 2019 - 2024. All rights reserved.