web-dev-qa-db-ja.com

データフレームRの列のNA値を0に置き換えます

可能性のある複製:
RでNAを0に設定

NA値を持つ列を持つdata.frameがあります。 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.frame NAの列xaを0に置き換えました。どうして?

26
Kunal Batra

これまでのところ誰も指摘するのにふさわしいと感じていなかったのでwhyあなたがしようとしていることはうまくいきません:

  1. _NA == NA_はTRUEを返さず、NAを返します(未定義の値と比較すると未定義の結果が得られるため)。
  2. アトミックベクトルでapplyを呼び出そうとしています。 applyを使用して列の要素をループすることはできません。
  3. あなたの添え字はオフです-あなたは_a$x_に2つのインデックスを与えようとしています。これはただの列(アトミックベクトル)です。

a$x[is.na(a$x)] <- 0に到達するために3を修正します。

64
themel

最初に、いくつかのサンプルデータを示します。

_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と書くこともできます