2012-12-04 76 views
23

我知道,在這個網站上有類似的問題,但是,他們都沒有充分回答我的問題。將csv文件導入到R中 - 讀取爲字符的數字值

這是我迄今所做的:

我有我在Excel中打開CSV文件。我用代數操作列來獲得一個新列「A」。我使用read.csv()將文件導入到R中,並將列A中的條目存儲爲因子 - 我希望它們以數字形式存儲。我找到有關該主題的問題:

Imported a csv-dataset to R but the values becomes factors

繼建議,包括我stringsAsFactors = FALSEread.csv()參數,但由於香港大井上面鏈接的頁面上提示,這不會導致中的條目列A被存儲爲數值。

一個可能的解決方案是使用以下頁面中給出的建議是:

How to convert a factor to an integer\numeric without a loss of information?

然而

,我想也就是一個方式清潔的解決方案要導入的文件,使列條目的條目存儲爲數字值。

乾杯的任何幫助!

+5

的Excel與文本文件沖水。在文本編輯器中打開csv以查看Excel正在變形。 –

+2

它可能是小數點符號的問題嗎?檢查CSV文件中使用的小數點符號。您可以在'read.csv'中用'dec'選項指定要用作十進制符號的字符。有關更多信息,請參閱'?read.csv'。 – djhurio

+0

做Joshua告訴你要做的事情,擅長銷燬csv頭文件。通常我使用options(stringsAsFactors = FALSE)來避免這些因素。 –

回答

22

無論代數你正在做在Excel中創建新的列也許可以在R.更有效地完成

請嘗試以下操作:閱讀原始文件(前任何操作出類拔萃)到使用read.csv(... stringsAsFactors=FALSE) [R 。 [如果這不起作用,請看看?read.table(其中read.csv換行),但可能存在其他潛在問題]。

例如:

delim = "," # or is it "\t" ? 
    dec = "." # or is it "," ? 
    myDataFrame <- read.csv("path/to/file.csv", header=TRUE, sep=delim, dec=dec, stringsAsFactors=FALSE) 

然後,假設你的數字列是4列

myDataFrame[, 4] <- as.numeric(myDataFrame[, 4]) # you can also refer to the column by "itsName" 


最後,如果您需要任何幫助與R中完成同樣的任務,你」在Excel中完成,這裏有很多人會很樂意幫助你

+0

謝謝。這是一個非常有用的清單。在這種情況下,通過在R中進行代數操作而不是Excel來解決問題。 – user32259

+0

沒問題@ user32259,很樂意幫忙 –

9

read.table(及其親屬)我t是na.strings參數,它指定哪些字符串被解釋爲缺失值NA。默認值爲na.strings = "NA"

如果其他數字變量列中的缺失值被編碼爲「NA」以外的其他值,例如, 「.」或「N/A」,這些行將被解釋爲character,然後整列轉換爲character

因此,如果您的缺失值是「NA」以外的其他值,則需要在na.strings中指定它們。

3

如果您正在處理大型數據集(即具有大量列的數據集),上述解決方案可能是手動麻煩的,並且需要您知道哪些列是數字先驗

試試這個。

char_data <- read.csv(input_filename, stringsAsFactors = F) 
num_data <- data.frame(data.matrix(char_data)) 
numeric_columns <- sapply(num_data,function(x){mean(as.numeric(is.na(x)))<0.5}) 
final_data <- data.frame(num_data[,numeric_columns], char_data[,!numeric_columns]) 

的代碼執行以下操作:

  1. 導入您的數據字符列。
  2. 以數字列的形式創建數據實例。
  3. 標識數據中的哪些列是數字(假設將數據轉換爲數字時NAs少於50%的列的確是數字)。
  4. 將數字和字符列合併到最終數據集中。

這實質上是通過保留原始列的數據類型(如字符和數字)來自動導入.csv文件。

1

版本data.table基於代碼dmanuge:

convNumValues<-function(ds){ 
    ds<-data.table(ds) 
    dsnum<-data.table(data.matrix(ds)) 
    num_cols <- sapply(dsnum,function(x){mean(as.numeric(is.na(x)))<0.5}) 
    nds <- data.table( dsnum[, .SD, .SDcols=attributes(num_cols)$names[which(num_cols)]] 
         ,ds[, .SD, .SDcols=attributes(num_cols)$names[which(!num_cols)]]) 
return(nds) 
}