2012-12-03 38 views
2

我有一個數據框1488 obs。和400 var。我試圖記錄表中的所有值,然後使用命令rm.outlier使用程序包異常值,我傾向於刪除異常值。唯一的問題是,我得到這個錯誤:rm.outlier函數在data.frame中的錯誤

Error in data.frame(V1 = c(-0.886056647693163, -0.677780705266081, -1.15490195998574, : arguments imply differing number of rows: 1487, 1480, 1481, 1475, 1479, 1478, 1483, 1485, 1484, 1477, 1482, 1469 

這是我的代碼:

datalog <- matrix(0,nrow(data),ncol(data)) 
datalog[,] <- apply(data,2,log10) 
datalog[datalog==-Inf] <- 0 
datalog <- as.data.frame(datalog, stringsAsFactors=F) 

testNoOutliers <- rm.outlier(datalog, fill = FALSE, 
         median = FALSE, opposite = FALSE) 

我的數據: https://skydrive.live.com/redir?resid=CEC7696F3B5BFBC6!341&authkey=!APiwy6qasD3-yGo

感謝所有幫助

+0

歡迎光臨!你的測試日誌功能是什麼? – agstudy

+0

哦,對不起,我在我的東西有不同的名字。只需將testlog重命名爲數據記錄即可。 – crysis405

+0

當我加載你的文件,我有超過1488 obs,我有7968 obs(數字行)!它是正確的數據文件? – agstudy

回答

0

你得到這個錯誤因爲不同數量的異常值會從每列中刪除,因此列不能放在一個數據框中。

如果你想用NA來替代離羣值,一個解決辦法是

out.rem<-function(x) { 
    x[which(x==outlier(x))]=NA 
    x 
} 

apply(datalog,2,out.rem) 

要刪除含有異常值整行,你可以添加額外的行@agstudy解決方案

ll <- apply(datalog,2,function(x) which(x == outlier(x))) 
new.datalog <- datalog[-unique(unlist(ll)),] 
+0

rm.outliers從每列中只刪除1個異常值,所以它應該仍然沒問題。最後應該刪除400個值。 – crysis405

+0

如果您閱讀「參數意味着行數不同:1487,1480,1481,...」的錯誤消息,則可以看到每列中的行數不同。你可以通過在一些列上單獨使用函數來嘗試它。 –

+0

但這隻意味着。抱歉,我是R新手。我使用Hmisc軟件包中的describe()函數,每列仍有1488行。有關如何修正此錯誤的任何建議? – crysis405

0

你有錯誤,因爲你沒有相同數量的離羣值變量。

要糾正它,你有兩個選擇:

  1. 把選項填充= TRUE:平均放置,而不是局外人,而不是刪除

  2. 自行刪除oulier:

    # get a list of outlier index for each variable 
        ll <- apply(datalog,2,function(x) which(x == outlier(x))) 
    
相關問題