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

Posted

技术标签:

【中文标题】将 R 中选定列中的所有 NA 替换为 FALSE【英文标题】:Replace all NA with FALSE in selected columns in R 【发布时间】:2011-11-08 21:29:22 【问题描述】:

我有一个类似于this one 的问题,但我的数据集有点大:50 列,其中 1 列作为 UID,其他列带有 TRUENA,我想更改所有 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)
)

我只想处理X1X2,怎么办?

【问题讨论】:

【参考方案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)
)
replace(df, is.na(df), FALSE)

已更新另一种解决方案。

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)

【讨论】:

【参考方案2】:

如果你想替换变量的子集,你仍然可以使用is.na(*) &lt;-技巧,如下:

df[c("x1", "x2")][is.na(df[c("x1", "x2")])] <- FALSE

IMO 使用临时变量使逻辑更容易理解:

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

【讨论】:

我知道这是一篇旧帖子,但你能向我解释一下第一行吗?当您使用临时变量将其分解时,我得到了逻辑,但我想了解单行形式。我以为我熟悉子集,但我不明白 [][]。我搜索了“双括号”,但结果有所不同。 @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 您也可以使用列位置而不是显式命名它们,这在您有很多变量要转换或它们有长名称时很有用:例如,df2[,14:16][is.na(df2[,14:16])] &lt;- 0 替换 @987654332 @ 与 0 在数据框 df2 的第 14、15 和 16 列中。【参考方案3】:

您可以使用gdata 包中的NAToUnknown 函数

df[,c('x1', 'x2')] = gdata::NAToUnknown(df[,c('x1', 'x2')], unknown = 'FALSE')

【讨论】:

除一个障碍外的出色功能 - 如果我想将未知数更改为 0,并且向量中已经有一些 NA 和零,那么我会收到错误消息 Error in NAToUnknown.default(x = dots[[1L]][[1L]], unknown = dots[[2L]][[1L]], : 'x' already has value “0”【参考方案4】:

dplyr 你也可以这样做

df %>% mutate_each(funs(replace(., is.na(.), F)), x1, x2)

与使用 replace()just 相比,它的可读性稍差,但更通用,因为它允许选择要转换的列。如果您想在某些列中保留 NA,但又想在其他列中删除 NA,则此解决方案尤其适用。

【讨论】:

【参考方案5】:

tidyr::replace_na功能很好。

df %>%
  replace_na(list(x1 = FALSE, x2 = FALSE))

这是一个非常棒的快速修复。唯一的诀窍是列出要更改的列。

【讨论】:

以上是关于将 R 中选定列中的所有 NA 替换为 FALSE的主要内容,如果未能解决你的问题,请参考以下文章

如何在R中将NA替换为1?

将列中的 NA 替换为相邻列中的值

用R中不同数据帧中具有相同ID的行中的值替换列中的NA

如何使用 tidyr::replace_na 替换数据框中的所有 NA? [复制]

R语言dplyr包将dataframe中的NA值替换(replace)为0实战:所有NA值替换(replace)为0具体列的NA值替换(replace)为0若干列的NA值替换(replace)为0

使用R函数将数据框列中的字符串替换为“”