2012-11-13 5 views
3

이진 파일을 R에 읽으려고하는데이 파일에는 2 진 코드로 작성된 데이터 행이 있습니다. 따라서 하나의 열에 속한 하나의 전체 데이터 세트가 대신 데이터 행으로 저장됩니다. 여기 내 데이터가 어떻게 표시되는지를 보여줍니다 같은 :이진 파일을 R으로 읽음

바이트 1-4 : INT ID 바이트 5 : 문자 응답 문자 바이트 6-9 : INT RESP 달러 바이트 10 : 문자 유형 문자

사람이 나에게 도움이 될 수 있습니다 그림 이 파일을 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으로 raw 바이트로 읽은 다음 파일과 같은 nrows를 가진 행렬로 밀어 넣은 다음 열 집합에서 readBin을 읽습니다. 그것은 빠르다. 이것은 본질적으로보다 복잡한 형식을 위해 모든 헤더 항목을 버리고 버려야합니다. 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

안녕하세요 Matthew - 코드를 따르려고하는데 파일에 UNIX 또는 Windows newline이 있는지 확인하는 방법이 궁금합니다. ? 감사! – user1819654

+0

파일을 작성하는 방법에 따라 알아야 할 사항입니다. 이진 데이터를보고 결정할 수 있습니다. UNIX 시스템을 사용하는 경우, 'od -t x1 '명령은 바이트 값을 인쇄합니다. 줄 종결 자로 사용되는 단일 '0a'는 UNIX 줄 끝을 의미합니다. 쌍인 '0d'와 '0a'는 Windows 줄 끝을 의미합니다. 한 레코드와 다음 레코드 사이에 공백이 없으면 줄 끝이 없으므로 여분의 readChar() 호출을 사용하여 (존재하지 않는) 끝 문자를 빨아 들여서는 안됩니다. –

+0

Matthew - 윈도우 라인 엔딩을 알아 냈습니다 - 마지막 질문 - 내 응답 달러 열을 입력 할 정확한 바이트 크기를 알아 내려고 시도했습니다 - 바이트 크기를 입력하려고 할 때마다 - 이 컴퓨터에서 알 수 없습니다 - 다음 바이트 크기를 시도했습니다 - 6,9,3,4,5 - 도움을 위해 미리 감사드립니다 – user1819654

관련 문제