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

时间:2011-09-02 03:59:23

标签: r dataframe na

我有类似this one的问题,但我的数据集有点大:50列,其中1列为UID,其他列为TRUENA,我想将所有NA更改为FALSE,但我不想使用显式循环。

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,如何做到这一点?

5 个答案:

答案 0 :(得分:29)

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

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

答案 1 :(得分: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)

更新以获得其他解决方案。

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 :(得分:6)

tidyr::replace_na出色的功能。

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

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

答案 3 :(得分:4)

您可以使用NAToUnknown

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

答案 4 :(得分:4)

使用dplyr您也可以

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

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