在R中的选定列中将所有NA替换为FALSE

lok*_*art 18 r missing-data dataframe na imputation

我有类似的问题这一个,但我的数据集是有点大:50列与1列UID等栏目,无论是携带TRUE还是NA,我想改变一切NAFALSE,但我不希望使用显式循环.

可以plyr做到的伎俩?谢谢.

更新#1

感谢您的快速回复,但如果我的数据集如下所示:

df <- data.frame(
  id = c(rep(1:19),NA),
  x1 = sample(c(NA,TRUE), 20, replace = TRUE),
  x2 = sample(c(NA,TRUE), 20, replace = TRUE)
)
Run Code Online (Sandbox Code Playgroud)

我只想要X1X2被处理,如何做到这一点?

Hon*_*Ooi 29

如果要替换变量子集,仍可以使用该is.na(*) <-技巧,如下所示:

df[c("x1", "x2")][is.na(df[c("x1", "x2")])] <- FALSE
Run Code Online (Sandbox Code Playgroud)

IMO使用临时变量使逻辑更容易遵循:

vars.to.replace <- c("x1", "x2")
df2 <- df[vars.to.replace]
df2[is.na(df2)] <- FALSE
df[vars.to.replace] <- df2
Run Code Online (Sandbox Code Playgroud)

  • 我知道这是一个老帖子,但你会向我解释第一行吗?当你使用临时变量分解它时,我得到了逻辑,但我想理解一行形式.我以为我熟悉子集,但我不理解[] [].我搜索了"双括号",但结果出现了不同的东西. (3认同)
  • @tmakino您只需要将双括号从左到右读作不同的子集。例如,如果`x &lt;- 1:10`,那么`x[5:10][1:4]` 会给你向量`5 6 7 8`。在多个步骤中,您可以取第一个子集并将其称为 y,`y &lt;- x[5:10]`,即 `5 6 7 8 9 10`。然后对向量 `y[1:4]` 进行子集化,再次得到 `5 6 7 8`。 (3认同)

Tri*_*ou. 9

试试这段代码:

df <- data.frame(
  id = c(rep(1:19), NA),
  x1 = sample(c(NA, TRUE), 20, replace = TRUE),
  x2 = sample(c(NA, TRUE), 20, replace = TRUE)
)
replace(df, is.na(df), FALSE)
Run Code Online (Sandbox Code Playgroud)

更新了另一种解决方案.

df2 <- df <- data.frame(
  id = c(rep(1:19), NA),
  x1 = sample(c(NA, TRUE), 20, replace = TRUE),
  x2 = sample(c(NA, TRUE), 20, replace = TRUE)
)
df2[names(df) == "id"] <- FALSE
df2[names(df) != "id"] <- TRUE
replace(df, is.na(df) & df2, FALSE)
Run Code Online (Sandbox Code Playgroud)


mte*_*sha 9

tidyr::replace_na 功能卓越.

df %>%
  replace_na(list(x1 = FALSE, x2 = FALSE))
Run Code Online (Sandbox Code Playgroud)

这是一个非常快速的解决方案.唯一的技巧是你要列出你想要改变的列.