我正在处理一个大型数据集,其中有 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
, is.na(d_clean$replace_NA1), value = 0) 中的错误: 列的重复下标*tmp*
我知道这是因为我使用了 d_clean$ 但当我在不调用数据框的情况下尝试它时,它说找不到对象。我做错了什么以及如何解决它?
在两列 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