2013-01-09 23 views
2

我將一個csv導入到R中,它認爲我的變量FERNH是一個因子;它不是。我無法弄清楚爲什麼或如何解決它。我已經審查了FERNH中的值,它們看起來是正確的並與其他8個變量一致。請指教。R將數據幀中的變量解釋爲因子;它不是

str(height) 
'data.frame': 512 obs. of 9 variables: 
$ DSH : int 50 4 35 10 12 0 0 30 0 0 ... 
$ ESH : int 0 0 0 0 0 30 80 10 8 15 ... 
$ ETH : int 0 0 0 0 0 0 0 0 0 0 ... 
$ CANEH : int 0 0 40 15 0 0 0 0 0 0 ... 
$ HERBH : int 0 0 0 0 0 0 5 15 25 10 ... 
$ FERNH : Factor w/ 32 levels "0","10","100",..: 1 1 1 13 1 1 26 1 14 1 ... 
$ C4H : int 0 0 0 0 0 0 0 0 0 13 ... 
$ GRASSH: int 40 0 0 0 0 0 0 0 0 0 ... 
$ DTH : int 0 0 0 0 0 0 0 0 0 0 ... 
+2

在那裏有一個'character'值,所以R按預期行事。看'水平(高度$ FERNH)'看到有問題的價值。您可以在您的讀取步驟或通過選項設置'stringsAsFactors = FALSE',但該列將是一個「字符」而不是「整數」。 – Justin

+0

@Justin'水平(身高$ FERNH)'是我需要的!謝謝!不幸的是我有's'而不是'5'。 – nofunsally

回答

5

@賈斯汀指出了這個問題。不過,您可以提供colClasses='integer'read.csv,而不是試圖通過levels找到您的違規值。然後R在閱讀過程中遇到這個值時會報錯,並報告它是什麼。

+0

+1。這是正確的方法,但我不認爲會出現錯誤,而是將違規價值作爲NA。 –

+0

嗯,我從'scan'得到一個錯誤。 (2.15.2):'read.csv(text =「1,'a',3」,header = FALSE,colClasses ='integer')' –

+0

你說得對。我認爲'as.integer'會被應用,並且只會返回警告。 –

4

在某處存在character值,因此R按預期行事。查看levels(height$FERNH)以查看違規價值。您可以在讀取步驟中設置stringsAsFactors=FALSE或通過options設置,但該列將是character而不是integer

雖然這看起來似乎很煩人,但如果字符列包含長字符串,則這是一個很好的數據質量檢查以及顯着的內存節省。

+1

空間節省將取決於數據的性質。一般而言,改變的方向是在重複程度高且字符串很長時使用字符串時增加空間要求。因素需要每個條目4個字節加上'levels'屬性。字符串將需要全部字符。 –

+0

@DWin這就是我的意思,只是試圖說太少的話。 :) – Justin

相關問題