2012-11-13 167 views
3

我正在嘗試將二進制文件讀入R,但是此文件具有以二進制代碼寫入的數據行。所以它沒有一組屬於一列的完整數據,而是存儲爲數據行。這裏是我的數據是什麼樣子:將二進制文件讀入R

字節1-4:INT ID 字節5:焦炭響應特性 字節6-9:INT RESP美元 字節10:char類型字符

有人能幫助我圖怎麼把這個文件讀入R?

嗨,夥計們,

這是迄今爲止嘗試使用的代碼。我嘗試了一些有限的成功。不幸的是,我無法發佈公共網站上的任何數據,並表示道歉。我對R來說比較新,所以我需要一些關於如何改進代碼的幫助。提前致謝。

> binfile = file("File Location", "rb") 
> IDvals = readBin(binfile, integer(), size=4, endian = "little") 
> Responsevals = readBin(binfile, character(), size = 5) 
> ResponseDollarsvals = readBin (binfile, integer(), size = 9, endian= "little") 
Error in readBin(binfile, integer(), size = 9, endian = "little") : 
    size 9 is unknown on this machine 
> Typevals = readBin (binfile, character(), size=4) 
> binfile1= cbind(IDvals, Responsevals, ResponseDollarsvals, Typevals) 
> dimnames(binfile1)[[2]] 
[1] "IDvals"   "Responsevals"  "ResponseDollarsvals" "Typevals" 

> colnames(binfile1)=binfile 
Error in `colnames<-`(`*tmp*`, value = 4L) : 
    length of 'dimnames' [2] not equal to array extent 
+2

你可以發佈數據文件的前幾行嗎? – Seth

+0

將它作爲readBin的原始字節讀取,並將其推入與文件相同的nrow矩陣中,然後將readBin從多組列中讀入。它很快。這基本上爲更復雜的格式,刪除所有標題的東西和slurp了:http://stackoverflow.com/questions/12931979/reading-binary-files-in-r – mdsumner

+0

提供的文件,我會放在一起一個例子。 – mdsumner

回答

4

您可以打開文件作爲原始文件,然後發出readBin或readChar命令來獲取每一行。隨時追加每個值到列中。

my.file <- file('path', 'rb') 

id <- integer(0) 
response <- character(0) 
... 

循環解決此塊:

id = c(id, readBin(my.file, integer(), size = 4, endian = 'little')) 
response = c(response, readChar(my.file, 1)) 
... 
readChar(my.file, size = 1) # For UNIX newlines. Use size = 2 for Windows newlines. 

然後創建您的數據幀。

請看這裏:http://www.ats.ucla.edu/stat/r/faq/read_binary.htm

+0

您好馬修 - 我試圖按照您的代碼,但想知道如何確定我的文件是否有UNIX或Windows換行符?謝謝! – user1819654

+0

根據你編寫文件的方式,你必須知道這些。您可以通過查看二進制數據來確定。如果您在UNIX系統上,則命令'od -t x1 '將打印字節值。作爲行終止符的單個'0a'意味着UNIX行尾。一對,'0d'和'0a'是指Windows行尾。一個記錄和下一個記錄之間沒有空格表示沒有行結束,並且不應該使用額外的readChar()調用來吸取(不存在的)結束字符。 –

+0

馬修 - 我想出了窗口行結束 - 最後一個問題 - 即時通訊嘗試找出正確的字節大小輸入我的響應美元列 - 每次我嘗試輸入字節大小 - 我不斷收到一個錯誤說,大小在這臺機器上是未知的 - 我嘗試了以下字節大小 - 6,9,3,4,5 - 在此先感謝您的幫助 – user1819654