2010-04-10 48 views
26

正如你對針對數據分析DSL期待,R處理缺少/不完整的數據非常好,比如:在R中處理丟失/不完整的數據 - 是否有掩蓋但不移除NAs的功能?

許多R的功能和有na.rm標誌,當設置爲TRUE ,除去在NAS:

>>> v = mean(c(5, NA, 6, 12, NA, 87, 9, NA, 43, 67), na.rm=T) 
>>> v 
     (5, 6, 12, 87, 9, 43, 67) 

但是如果你想前處理的NA 函數調用,你需要做的是這樣的:

從矢量中刪除每個「NA」:

vx = vx[!is.na(a)] 

從向量刪除的每個「NA」和替換它瓦特/「0」:

ifelse(is.na(vx), 0, vx) 

以去除整個各行包含「NA」從數據幀:

dfx = dfx[complete.cases(dfx),] 

所有這些功能永久除去「NA」或行與他們的「NA」。

有時候這並不完全符合你的想法 - 使工作流中的下一步需要數據框的'NA'刪除副本,但在後續步驟中,您經常需要這些行返回(例如,爲先前調用'complete cases'但該列中沒有'NA'值導致缺少行的列計算列逐列統計量。

儘可能什麼我要找的是明確的:蟒蛇/ numpy的有一個類,屏蔽數組,具有面具方法,它可以讓你隱瞞 - 但不是remove--在函數調用期間的NA。 R中有類似的功能嗎?

回答

18

究竟如何處理丟失的數據 - 如果我們知道丟失數據可能會被標記爲NA - 可能會因域而異。

採取相關的時間序列,在那裏你可以跳過或填充物,或插或內插不同的一個例子,是...... 只是(非常有用和流行)zoo擁有所有這些功能有關NA處理:

zoo::na.approx zoo::na.locf  
zoo::na.spline zoo::na.trim  

允許近似(使用不同的算法),進 - 向前或向後,使用樣條內插或修剪。

另一個例子是CRAN上大量缺失的插補軟件包 - 通常提供特定於領域的解決方案。 [所以,如果你打電話給DSL,這是什麼? 「域特定語言的子域特定解決方案」還是SDSSFDSL?相當一口:) :)

但是對於你的具體問題:不,我不知道基準R中的一個位級標誌,允許你將觀察結果標記爲'被排除'。我認爲大多數R用戶會訴諸如na.omit()等功能或使用您提到的na.rm=TRUE選項。

+1

您到動物園的鏈接已損壞。 [Here](http://cran.r-project.org/web/packages/zoo/zoo.pdf)是我能找到的最新文檔(.pdf警告)的鏈接,[Here](http:/ /cran.r-project.org/web/packages/zoo/index.html)是我認爲是動物園最新總結的鏈接。 – deadstump 2012-11-02 14:40:12

+1

URL中的錯誤複數'',因爲它是'package = ...',而不是'packages = ...'。現在修好了,謝謝。 – 2012-11-02 14:50:36

15

查看數據是一個很好的做法,因此推斷缺失值的類型:它是MCAR(缺失完整和隨機),MAR(隨機缺失)還是MNAR(不隨機缺失)?基於這三種類型,您可以研究缺失值的基本結構並確定歸因是否完全適用(如果不是MNAR,那麼您很幸運,因爲在這種情況下,缺失值被認爲是不可忽略的,並且是涉及一些未知的潛在影響,因素,過程,變量......無論如何)。

第3章中「交互式動態圖形數據分析師R和GGobi」迪庫克德博拉Swayne是關於這個話題很好的參考。

在本章中您將看到norm包,但Hmisc包有數據插補例程。另見Amelia,cat(用於分類缺失插補),mi,mitools,VIM,vmv(用於缺失數據可視化)。

老實說,我還是不太明白是你的統計問題,還是關於R缺失的數據插補能力?我認爲我已經爲第二個提供了很好的參考資料,第一個提供了很好的參考資料:您可以用集中趨勢(平均值,中值或相似值)代替您的NA,從而減少變異性或隨機常量「拉出」的觀察到的(記錄的)病例,或者您可以將包含NA作爲標準的變量和其他變量作爲預測變量進行迴歸分析,然後將殘差分配給NA ...這是處理NA的一種優雅方式,但通常不會在你的CPU上輕鬆一點(我在1.1GHz上擁有賽揚,所以我必須要溫和)。

這是一個優化問題...沒有明確的答案,你應該決定什麼/你爲什麼堅持一些方法。但是查看數據總是很好的做法! =) 一定要檢查庫克& Swayne - 這是一個優秀的,精湛的書面指南。 「帶R的線性模型」作者:遠景也包含有關缺失值的章節。

所以那裏。

祝你好運! =)

8

函數na.exclude()聽起來像你想要的,儘管它只是一些(重要的)函數的一個選項。

在裝配和處理模型的情況下,R設有負責來港家庭的通用功能:na.fail()na.pass()na.omit(),並na.exclude()。這些依次是R的一些關鍵建模函數的參數,如lm(),glm()nls()以及MASS,rpart和生存包中的函數。

所有四個通用函數基本上起到了過濾器的作用。如果沒有NAs,na.fail()將只傳遞數據,否則失敗。 na.pass()通過所有案件。 na.omit()na.exclude()都會遺漏帶有NAs的案例並通過其他案例。但是na.exclude()有一個不同的屬性,告訴函數處理結果對象以考慮NA。你可以看到這個屬性,如果你做了attributes(na.exclude(some_data_frame))。下面演示了na.exclude()如何在線性模型的上下文中改變predict()的行爲。

fakedata <- data.frame(x = c(1, 2, 3, 4), y = c(0, 10, NA, 40)) 

## We can tell the modeling function how to handle the NAs 
r_omitted <- lm(x~y, na.action="na.omit", data=fakedata) 
r_excluded <- lm(x~y, na.action="na.exclude", data=fakedata) 

predict(r_omitted) 
#  1  2  4 
# 1.115385 1.846154 4.038462 
predict(r_excluded) 
#  1  2  3  4 
# 1.115385 1.846154  NA 4.038462 

您的默認na.action,順便說一句,是由options("na.action")確定並開始爲na.omit(),但是你可以設置它。