2010-04-29 32 views
3

製表符分隔的文本文件,它實際上是(使用BCP)一個數據庫表中的一個出口,是形式的(前5分列):正確地讀出(阿爾法)的數值字段爲R

102 1 01 e113c 3224.96  12 
102 1 01 e185 101127.25 12 
102 2 01 e185 176417.90 12 
102A 3 01 e185 26261.03 12 

我試圖像

data <- read.delim("C:\\test.txt", header = FALSE, sep = "\t") 

的問題是,在第三列這實際上是一個varchar字段(字母數字)被錯誤地讀取爲整數(因爲有在整個列中沒有字母)的命令將其導入作爲R前導零點消失。當我使用odbcConnect直接從數據庫導入數據時,發生了同樣的情況。該列再次被讀爲整數。

str(data) 
$ code: int 1 1 1 1 1 1 6 1 1 8 ... 

如何導入這樣的數據集R中正確,以便能夠安全地重新填充該數據庫表,做了一些數據操作之後?

編輯

我沒有將它添加在read.delim

colClasses = c("factor","integer","factor","factor","numeric","character","factor","factor","factor","factor","integer","character","factor") 
  • 以下參數,你會建議爲VARCHAR領域 「字符」 或 「因素」?

  • 可以使用「字符」日期時間的人嗎?

  • 我應該怎麼做才能夠讀取像這樣的540912.68999999994這樣的數字字段,而不是540912.69?

我想一個-as自動爲possible-創造,colClasses載體,這取決於在相關表格的架構中定義的數據類型。

+0

如果日期處於'%Y-%m-%d'或'%Y /%m /%d'格式,日期可以作爲'Date'或'POSIXct'處理。 – Marek 2010-04-29 10:20:58

+0

@Marek:謝謝,但是......看起來它們不是: charToDate(x)中的錯誤: 字符串不是標準的明確格式。 as.POSIXlt.character(x,tz,...)中的錯誤: 字符串不是標準的明確格式。當我使用「角色」時,我沒有問題。 – 2010-04-29 10:25:00

+0

你可以搜索是否有可能在bcp下設置日期格式(這是本地依賴於我認爲的默認值) – Marek 2010-04-29 11:43:29

回答

4

你會爲varchar字段提供「字符」還是「因子」?

正如約翰所說,這取決於用法。在兩者之間切換很簡單,所以不要太擔心。如果該列表示分類變量,則最終應將其視爲factor。如果您打算挖掘文本(例如註釋字段),那麼character更有意義。

可以使用日期時間字符嗎?

它的罰款用於存儲在數據幀的日期,但如果你希望他們正確地進行分析的目的來處理,你必須把它轉換爲DatePOSIXct/POSIXlt形式。

我應該怎麼做才能夠像這樣讀取一個像這樣的540912.68999999994這樣的數字字段而不是540912.69?

將值讀入通常的雙精度(約15 sig figs);在這個特定的例子中,540912.69是你能達到的最好的精度。比較

print(540912.68999999994)    # 540912.7 
print(540912.68999999994, digits=22) # 540912.69 
print(540912.6899999994)    # 540912.7 
print(540912.6899999994, digits=22) # 540912.6899999994 

編輯:如果您需要更精確的爲你的號碼,使用Rmpfr包。


我想一個-as自動爲possible-創造條件,colClasses向量,這取決於在相關表格的架構中定義的數據類型。

colClasses(當你沒有指定它時)的默認值在猜測列應該是什麼時做得很好。如果你正在使用01作爲角色,那麼就沒有辦法明確指定它。

+0

+1非常感謝。關於精確度問題:我完全理解這些值是以正確的精度讀取的。我只是希望能夠在初始文本文件和write.table命令生成的文件之間進行*完美比較*(在我的情況下 - 我做的唯一修改是重新排列列),所以我可以確信,沒有什麼搞砸了。顯然,這是不可能完成任何類型的四捨五入時:( – 2010-04-29 15:25:00

1

性格和因素問題是唯一可以回答的問題。這取決於您是否需要稍後將它們用作因素或字符。這也取決於你是否需要在之後清理它們。例如,如果您打算在事後對某個因素應用一些ifelse()修改,那麼現在就可以將其作爲字符讀入,並在稍後將其轉化爲一個因子。或者,如果您想以某種方式特定編碼因子,您可能會更好地閱讀它。

另一方面,您使用read.delim over read.table的原因是因爲默認設置,因此不要打擾將sep設置爲默認設置。

+0

謝謝。對我而言最重要的是能夠將數據加載回數據庫而不損壞數據。至於sep設置,它仍然存在,因爲我最初試圖改變它。 http://stackoverflow.com/questions/2732397/why-the-field-separator-character-must-be-only-one-byte – 2010-04-29 10:28:20