22

我有一个与此类似的问题,但我的数据集有点大:50 列,其中 1 列作为 UID,其他列带有TRUEor 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)
)

我只想X1X2被处理,这怎么办?

4

5 回答 5

33

如果要替换变量子集,仍然可以使用该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
于 2011-09-02T04:46:58.933 回答
14

tidyr::replace_na出色的功能。

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

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

于 2016-09-19T13:55:08.200 回答
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)
于 2011-09-02T04:08:41.463 回答
4

您可以使用包NAToUnknown中的功能gdata

df[,c('x1', 'x2')] = gdata::NAToUnknown(df[,c('x1', 'x2')], unknown = 'FALSE')
于 2011-09-02T13:53:56.970 回答
4

dplyr你一起也可以

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

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

于 2015-03-27T15:31:19.917 回答