2013-04-30 54 views
0

我對R完全陌生,我一直試圖用每個列的平均值替換NA值。我嘗試了很多選擇。但似乎沒有工作。我試過這個和許多類似的,但我繼續得到:argument is not numeric or logical: returning NA用列表的平均值替換列表中的所有NA號碼

script<-function() { 
for (i in names(data)) { 
     data[[i]][is.na(data[[i]])] <- mean(data[[i]], na.rm=TRUE); 
    } 
} 

過了一會我覺得還是算列和與此上來後:

script<-function() { 
    for (i in 1:20) { 
     data[[i]][is.na(data[[i]])] <- mean(data[[i]], na.rm=TRUE); 
    } 
} 

不顯示任何錯誤,但似乎並沒有任何工作。當我輸入數據時,它只是相同的數據框,但未經編輯。任何人都可以幫助我嗎?

+1

你的代碼是正確的(雖然我不知道它爲什麼包裹在一個函數中);也許問題出在你的數據上。 'str(data)'的輸出是什麼? – Aaron 2013-04-30 02:01:11

+0

你可以發佈示例'數據'? – Nishanth 2013-04-30 02:01:21

+0

@Aaron請注意,他們的代碼實際上是封裝在一個函數中,但它們沒有正確縮進。 – Dason 2013-04-30 02:01:34

回答

5

與功能的問題是,它是一個函數,並由此作用域僅在運行如你所願

for (i in names(data)) { 
     data[[i]][is.na(data[[i]])] <- mean(data[[i]], na.rm=TRUE); 
      } 
     } 

不是一個函數內將工作中的作用

的範圍內更新data

另一種方法是通過使用lapply

傳遞 data作爲參數

imputeMean <-function(data) { 

    for (i in names(data)) { 
    data[[i]][is.na(data[[i]])] <- mean(data[[i]], na.rm=TRUE); 
     } 
    return(data) 
    } 
# then you can save the result as a new object 

updatedData <- imputeMean(data) 

注意,對於命名列表(如data是),[[<-每次都會拷貝,所以你可以解決這個問題

updatedData <- lapply(data, function(x) replace(x, is.na(x), mean(x, na.rm = TRUE))) 
+0

您忘記添加一行'data'或者重試(數據),以避免除了最後一次評估結果之外的函數不會重試其他任何事情。 – 2013-04-30 02:42:37

+0

@Dwin確實和固定 – mnel 2013-04-30 03:07:36

+0

謝謝,我只是把它拿出來的功能,它工作正常 – user2334207 2013-04-30 18:40:03

0

隨意製作一個功能(更新根據更正更正):

data.frame(lapply(data, function(x){replace(x, is.na(x), mean(x,na.rm=T))})) 
+2

不要在data.frames上使用'apply'。這會強制轉換爲矩陣,因此記憶效率不高,並會將所有列強制轉換爲相同類型。 'lapply'是要走的路。 – mnel 2013-04-30 04:00:52