一个选择是使用
for
循环。
for(i in c("x1", "x2")) df[[i]][is.na(df[[i]])] <- FALSE
基准测试
set.seed(42)
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)
)
bench::mark(check=FALSE,
"Holger Brandl" = local(dplyr::mutate_each(df, dplyr::funs(replace(., is.na(.), F)), x1, x2)),
"mtelesha" = local(df <- tidyr::replace_na(df, list(x1 = FALSE, x2 = FALSE))),
Ramnath = local(df[,c('x1', 'x2')] <- gdata::NAToUnknown(df[,c('x1', 'x2')], unknown = 'FALSE')),
"Hong Ooi" = local(df[c("x1", "x2")][is.na(df[c("x1", "x2")])] <- FALSE),
GKi = local(for(i in c("x1", "x2")) df[[i]][is.na(df[[i]])] <- FALSE) )
for
循环比第二个选项Hong Ooi快3倍,并且使用最少的内存。
x <- 1:10
,那么x[5:10][1:4]
将给你向量5 6 7 8
。通过多个步骤,你可以先取第一个子集并将其命名为 y,即y <- x[5:10]
,此时y
是5 6 7 8 9 10
。然后再在向量y
上进行子集操作y[1:4]
,这样就再次得到了5 6 7 8
。 - blakeoftdf2[,14:16][is.na(df2[,14:16])] <- 0
将数据框 df2 的第14、15和16列中的NA
替换为0
。 - coip