2017-12-27 12 views
0

어떻게 fwf가있는 파일의 벡터를 데이터 프레임으로 읽을 수 있습니까?리터럴 데이터 (파일 아님)의 데이터 프레임이 R

지금은 두 가지 방법을 생각할 수 있지만 실제로는 더 좋은 방법이 있어야한다고 생각합니다. 어떤 생각이라도 감사합니다.

  1. 사용 data.frame() + substring(). 그것은 일을하지만 데이터가 "불규칙적"이라면 쉽게 일반화 할 수 없습니다 (아래 블록과 같은 블록). 나는 대답에서 그것을 얻었다 : Read fixed width text file

  2. reader에서 write_lines()read_fwf()를 사용하십시오. 나는 외부 파일을 쓰는 것을 피하고 싶다. 실제로는 read_fwf()이 리터럴 데이터에서 직접 작업해야하지만 작동하지는 못합니다. 줄의 문자열/벡터를 경로로 계속 이해합니다. 같은 뭔가 :

    write_lines(literaldata, "fwf_sample.txt") 
    read_fwf("fwf_sample.txt", fwf_widths(rep(8, 12))) 
    

데이터 샘플은 오류에 이르게 코드 아래 다음과 같습니다. 사전에

literaldata <- "CHEXA  278375  2 419991 419976 418527 418528 434131 434116+   420108 420107 
CHEXA  278376  2 420028 420029 419994 419997 434168 434169+   434134 434137 
CHEXA  278377  2 419961 418516 418517 419956 434101 420119+   420118 434096 
CHEXA  278378  2 419965 418519 418520 419967 434105 420116+   420115 434107 
CHEXA  278379  2 419965 419984 420025 419971 434105 434124+   434165 434111 
CHEXA  278380  2 418521 419972 419967 418520 420114 434112+   434107 420115" 

library(readr) 
lines<-read_lines(literaldata) 
# The code above is just to get a reproducible example similar to the one I get in the data cleaning process 
read_fwf(lines, fwf_widths(rep(8, 12))) 


Error: 'CHEXA  278375  2 419991 419976 418527 418528 434131 
434116+   420108 420107CHEXA  278376 ... 

감사

+0

'read_fwf (textConnection (literaldata), fwf_widths (대표 (8,12)))'할겠습니까 응답 일? –

+0

'read_fwf()'가 경로 이름의 리터럴 데이터를 잘못 쓰는 곳에 코드를 게시 할 수 있습니까? 게시 한 데이터에서 정상적으로 작동하기 때문입니다. –

답변

0

당신이하고있는 정확히 무엇인지 확실하지. 함수 read_fwf()은 데이터를 올바르게 처리합니다. read_fwf() (강조 광산)의 문서에서

literaldata <- "CHEXA  278375  2 419991 419976 418527 418528 434131 434116+   420108 420107 
CHEXA  278376  2 420028 420029 419994 419997 434168 434169+   434134 434137 
CHEXA  278377  2 419961 418516 418517 419956 434101 420119+   420118 434096 
CHEXA  278378  2 419965 418519 418520 419967 434105 420116+   420115 434107 
CHEXA  278379  2 419965 419984 420025 419971 434105 434124+   434165 434111 
CHEXA  278380  2 418521 419972 419967 418520 420114 434112+   434107 420115" 

library(readr) 
read_fwf(literaldata, fwf_widths(rep(8, 12))) 

# # A tibble: 6 x 12 
#  X1  X2 X3  X4  X5  X6  X7  X8  X9 X10 X11 X12 
# <chr> <int> <int> <int> <int> <int> <int> <int> <int> <chr> <int> <int> 
# 1 CHEXA 278375  2 419991 419976 418527 418528 434131 434116  + 420108 420107 
# 2 CHEXA 278376  2 420028 420029 419994 419997 434168 434169  + 434134 434137 
# 3 CHEXA 278377  2 419961 418516 418517 419956 434101 420119  + 420118 434096 
# 4 CHEXA 278378  2 419965 418519 418520 419967 434105 420116  + 420115 434107 
# 5 CHEXA 278379  2 419965 419984 420025 419971 434105 434124  + 434165 434111 
# 6 CHEXA 278380  2 418521 419972 419967 418520 420114 434112  + 434107 420115 

는 :

리터럴 데이터는 실시 예 및 시험에 가장 유용하다. 경로 대신에 적어도 하나의 새로운 라인을 데이터로 인식해야합니다.

+0

회신 해 주셔서 감사합니다. 다음과 같이 할 수 있습니다.
'paste0 (vectorOfLines, collapse = "\ n")' 그것은 나를위한 일이지만, 독자가 필요로하지 않는 것으로 보인다. 'paste0()' 리터럴 데이터는 예제 및 테스트에 가장 유용합니다. 경로 대신에 데이터로 인식되거나 길이 1 **보다 큰 ** 벡터이어야하는 새 행을 하나 이상 포함해야합니다. – loistf

+0

아직 재현 할 수없는 예를 제공하지 못 했으므로 어떤 작업을하는지 알지 못합니다. 다음 내용을 읽어보십시오. https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example –

0

내 이전 예제가 작동하지 않는 이유는 아직 명확하지 않지만 paste0(...,collapse = "\n")을 추가하면 작동하지 않습니다. 그래서, 나를 위해 다음과 같은 작품과 같은 :

literaldata <- "CHEXA  278375  2 419991 419976 418527 418528 434131 434116+   420108 420107 
CHEXA  278376  2 420028 420029 419994 419997 434168 434169+   434134 434137 
CHEXA  278377  2 419961 418516 418517 419956 434101 420119+   420118 434096 
CHEXA  278378  2 419965 418519 418520 419967 434105 420116+   420115 434107 
CHEXA  278379  2 419965 419984 420025 419971 434105 434124+   434165 434111 
CHEXA  278380  2 418521 419972 419967 418520 420114 434112+   434107 420115" 

library(readr) 
lines<-read_lines(literaldata) 
# The code above is just to get a reproducible example similar to the one I get in the data cleaning process 
# The following gives an error 
read_fwf(lines, fwf_widths(rep(8, 12))) 
# The following give the expected result 
read_fwf(paste0(lines,collapse = "\n"), fwf_widths(rep(8, 12))) 

도움을 모두에게 감사하고