2012-11-01 147 views
21

可能重複:
Set NA to 0 in R從柱上用0在數據幀R替換NA值

我具有由具有NA值的列一個data.frame。我想用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; 

無上述方法中x列替換NA與0 data.frame a。爲什麼?

+0

你想用'0'中的所有列,或者只列'x'更換'NA'? – A5C1D2H2I1M1N2O1R2T1

+0

@mrdwab:只是列x –

回答

43

既然沒有人至今認爲適合指出爲什麼你正在嘗試不起作用:

  1. NA == NA不返回TRUE,它返回NA(因爲比較未定義的值應該產生未定義的結果)。
  2. 您正試圖在原子矢量上調用apply。您不能使用apply來遍歷列中的元素。
  3. 您的下標已關閉 - 您正嘗試將兩個索引分配到a$x,這就是列(原子向量)。

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

8

首先,這裏的一些樣本數據:

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

+0

這件事情工作。感謝很多。如果我在我嘗試的上述方法中遇到錯誤,您能否提出建議? –

+0

僅僅因爲其簡單性而不是您的「替代」解決方案?兩個雙括號的使用是否有優勢? –

+0

@MikePalmice,當然。如果您嘗試以編程方式處理問題(例如,在函數中),則「備選」解決方案將會出現問題。 – A5C1D2H2I1M1N2O1R2T1