在数据框的列中用0替换NA

49

可能是重复问题:
在R中将NA设置为0

我有一个包含NA值的数据框。我想用0或其他任何值替换NA,但尝试了很多方法都没有得到结果。我已经尝试了下面的方法。

a$x[a$x == NA] <- 0;
a[ , c("x")] <- apply(a[ , c("x")], 1, function(z){replace(z, is.na(z), 0)});
a$x[is.na(a$x), ] <- 0;

以上方法都没有在数据框 a 的列 x 中将 NA 替换为 0。为什么?


您想在所有列中将 NA 替换为 0,还是只替换 x 列? - A5C1D2H2I1M1N2O1R2T1
1
@mrdwab:只需要列 x - Kunal Batra
2个回答

105

由于迄今为止没有人觉得有必要指出为什么您尝试的方法不起作用:

  1. NA == NA 不返回 TRUE,而是返回 NA(因为与未定义的值进行比较应该产生未定义的结果)。
  2. 您正在尝试对一个原子向量调用 apply。您不能使用 apply 对列中的元素进行循环。
  3. 您的下标有误 - 您正在尝试给出两个索引到 a$x 中,这只是一个列(一个原子向量)。

我会修复第3个问题,以得到 a$x[is.na(a$x)] <- 0


优秀的解释。 - shantanu pathak

15

首先,这是一些样本数据:

set.seed(1)
dat <- data.frame(one = rnorm(15),
                 two = sample(LETTERS, 15),
                 three = rnorm(15),
                 four = runif(15))
dat <- data.frame(lapply(dat, function(x) { x[sample(15, 5)] <- NA; x }))
head(dat)
#          one  two       three      four
# 1         NA    M  0.80418951 0.8921983
# 2  0.1836433    O -0.05710677        NA
# 3 -0.8356286    L  0.50360797 0.3899895
# 4         NA    E          NA        NA
# 5  0.3295078    S          NA 0.9606180
# 6 -0.8204684 <NA> -1.28459935 0.4346595

这是我们的替代品:

dat[["four"]][is.na(dat[["four"]])] <- 0
head(dat)
#          one  two       three      four
# 1         NA    M  0.80418951 0.8921983
# 2  0.1836433    O -0.05710677 0.0000000
# 3 -0.8356286    L  0.50360797 0.3899895
# 4         NA    E          NA 0.0000000
# 5  0.3295078    S          NA 0.9606180
# 6 -0.8204684 <NA> -1.28459935 0.4346595

当然,你也可以这样写:dat$four[is.na(dat$four)] <- 0


这个东西有效了。非常感谢。您能否建议我在尝试的上述方法中是否做错了什么。 - Kunal Batra
你的“另一种”解决方案不是因为它的简单性而更好吗?使用两个双括号有什么优势吗? - 3pitt
1
@MikePalmice,好的。如果您试图以编程方式(例如,在函数内部)解决问题,“另一种选择”解决方案将会有问题。 - A5C1D2H2I1M1N2O1R2T1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接