44

重複の可能性:
R で NA を 0 に設定する

値を持つ列を持つ data.frame がありNAます。または他の値NAに置き換えたい。0多くのスレッドとメソッドを試しましたが、結果が得られませんでした。以下の方法を試しました。

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. 添え字がオフです - に 2 つのインデックスを与えようとしていますが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 に答える