2015-04-03 57 views
0

我有一個包含大量空白空間(「」代替NA)的數據集。我想將這些空白空間重新編碼爲NA(我想使用一些填充程序包像來自R生態系統的小鼠)。爲此,我想下面的代碼:使用R將數據集中的空白空間重新編碼爲NA

emptyToNA <- function(x){ 
    y <- data.frame(matrix(NA,nrow=nrow(x),ncol=ncol(x))) 
    for(i in ncol(x)){ 
    for(j in nrow(x)){ 
     if(x[j,i] != ""){ 
     y[j,i] = x[j,i] 
     } 
    } 
    } 
    return(y) 
} 

不過,我得到這個錯誤:Error in if (x[j, i] != "") { : missing value where TRUE/FALSE needed。所以我認爲if條款中的條件沒有正確評估。

但是,當我只是檢查data[j,i] != ""的某些值ij時,它正確地評估爲TRUE/FALSE。只有當我使用該函數時纔會出現該錯誤。

我找不出原因。任何幫助將不勝感激。

感謝

回答

2

其他兩個答案指向你走向更好的做法,但可能有很好的理由來解釋什麼可能做了測試成功。如果有任何缺失值,請不要只測試不平等。

> if(NA){print(TRUE)} 
Error in if (NA) { : missing value where TRUE/FALSE needed 
> if(TRUE){print(TRUE)} 
[1] TRUE 

使用

if (!is.na(x[j,i]) && x[j,i] != ""){ y[j,i] = x[j,i] } 

x[j,i]是NA測試不平等會不會引發錯誤的方式。 (什麼都不等於或不等於NA)。第一個邏輯測試解決了連接測試時的問題,因爲它不關心第二項值是什麼,所以如果有一個NA,第二個子句永遠不會被評估。

> FALSE && NA 
[1] FALSE 
3

我不認爲通過元素的循環是在這幾樣操作的一個很好的做法,因爲你可以很容易地使一個數組操作,這往往要快得多。例如,

y = x 
y[x==""] = NA 

會做你想做的。例如,

> x = matrix("", 3, 3) 
> y = x 
> y[x==""] = NA 
> y 
     [,1] [,2] [,3] 
    [1,] NA NA NA 
    [2,] NA NA NA 
    [3,] NA NA NA 
2

這並不直接回答你的問題,但是如果你只是單純的想改變「」到NA,下面的(短)的代碼會工作得很好:

可以說DF是你的據幀:

df[df==""]<- NA 
df 
3

一個值得考慮的選擇是使用type.convert它有一個na.strings說法,就像read.table和家人。

下面是一個例子:

A <- B <- data.frame(
    v1 = c("", "A", "B x"), 
    v2 = c(" ", "", "X"), 
    v3 = c("Z", "  ", "y")) 
A # and B 
# v1 v2 v3 
# 1   Z 
# 2 A   
# 3 B x X  y 

## Convert just "", but not spaces 
A[] <- lapply(A, function(x) { 
    type.convert(as.character(x), na.strings = "") 
}) 

A 
#  v1 v2 v3 
# 1 <NA>   Z 
# 2 A <NA>  
# 3 B x X  y 

這是當我寫makemeNA作爲我的GitHub只"SOfun" package一部分,我採取的方法。

這裏有幾個例子:

library(SOfun) 
makemeNA(B, "", FALSE)    ## Just "" 
#  v1 v2 v3 
# 1 <NA>   Z 
# 2 A <NA>  
# 3 B x X  y 
makemeNA(B, "^[ ]+$", fixed = FALSE) ## Both "" and spaces 
#  v1 v2 v3 
# 1 <NA> <NA> Z 
# 2 A <NA> <NA> 
# 3 B x X y 
+0

感謝大家誰分享了他們的意見/意見/建議。以上所有評論都有助於我的理解。再次感謝。 – user62198 2015-04-04 15:31:30