44

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

我有一个 data.frame,其中有一列有NA值。我想替换NA0或任何其他值。我尝试了很多线程和方法,但没有给我结果。我尝试了以下方法。

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;

上述方法均未替换为 data.frameNA列中的 0 。为什么?xa

4

2 回答 2

96

由于到目前为止没有人觉得适合指出为什么你正在尝试的东西不起作用:

  1. NA == NA不返回TRUE,它返回NA(因为与未定义的值比较应该产生未定义的结果)。
  2. 您正在尝试调用apply原子向量。您不能使用apply循环遍历列中的元素。
  3. 您的下标已关闭-您正在尝试将两个索引赋予a$x,这只是列(原子向量)。

我会修好 3. 去a$x[is.na(a$x)] <- 0

于 2012-11-01T07:59:49.167 回答
14

首先,这里有一些示例数据:

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

于 2012-11-01T07:40:06.520 回答