将 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,其他列带有 TRUE
或 NA
,我想更改所有 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)
)
我只想处理X1
和X2
,怎么办?
【问题讨论】:
【参考方案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(*) <-
技巧,如下:
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 <- 1:10
,那么x[5:10][1:4]
将为您提供向量5 6 7 8
。在多个步骤中,您可以获取第一个子集并将其命名为 y,y <- x[5:10]
,即5 6 7 8 9 10
。然后子集该向量y[1:4]
,它再次给你5 6 7 8
。
您也可以使用列位置而不是显式命名它们,这在您有很多变量要转换或它们有长名称时很有用:例如,df2[,14:16][is.na(df2[,14:16])] <- 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的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 tidyr::replace_na 替换数据框中的所有 NA? [复制]
R语言dplyr包将dataframe中的NA值替换(replace)为0实战:所有NA值替换(replace)为0具体列的NA值替换(replace)为0若干列的NA值替换(replace)为0