'col.names'에 해당되는 글 1건

  1. 2015.07.17 R read.fwf() : 일정한 간격, 고정된 구조의 외부데이터 불러오기 (4)

엑셀에서 외부 텍스트 데이터를 불러올 때 (1) ',', ':', ' ' 등의 구분자로 column을 구분하는 방식이 있고, (2) 일정한 간격, 고정된 폭으로 되어 있어서 대화상자에서 구분하는 폭/선을 마우스로 지정해주는 방식이 있습니다.

 

R에서 (1) 구분자가 들어있는 외부 텍스트 파일 불러오기는 지난번 포스팅에서 read.table(), read.csv() 함수를 소개했는데요,

 

이번 포스팅에서는 (2) 고정된 폭의 외부 텍스트 파일을 불러오는 함수 read.fwf() 함수에 대해 알아보겠습니다.

 

 

read.fwf() : 일정한 간격, 고정된 폭 구조의 외부데이터 불러오기

 

fwf 는 fixed width file 의 약자입니다.

아래 예제를 보면서 따라해보면 금방 사용법 알 수 있을 거예요.

 

 아래 형태처럼 1~2자리, 3~5자리, 6~8자리로 일정한 간격으로 되어있는 데이터를 불어와보도록 하겠습니다.

data_fwf.txt

 

 

read.fwf("디렉토리 경로",

       widths = c(간격 설정),

        col.names = c(변수명 설정))

 

> # fwf() 함수로 일정한 간격 외부 텍스트 데이터 불러오기

> data_fwf <- read.fwf("C:/Users/user/Documents/R/data_fwf.txt", # 경로 '/' 주의 + widths = c(2,3,3), + col.names = c("Var_1", "Var_2", "Var_3"))

 

 

불러온 데이터를 확인해 보면, col.names에서 할당한 변수명대로 해서 일정한 간격으로 구분되어 데이터가 들어가 있음을 알 수 있습니다.

 

> data_fwf
  Var_1 Var_2 Var_3
1    11   aaa   222
2    33   bbb   444
3    55   ccc   666

 

구분자를 안쓰는 경우 자칫 중간에 데이터가 꼬일 수 있으므로 read.fwf() 함수는 조심해서 써야 합니다. 기계에서 일정한 간격으로 흐트러짐 없이 쏟아져나오는 센서 데이터와 같이 일정한 간격, 고정된 구조의 데이터라고 확신이 있을 때만 사용하시기 바랍니다.

 

이번 포스팅이 도움이 되었다면 아래의 '공감 ~♡' 단추를 꾸욱 눌러주세요.^^

 

Posted by R Friend R_Friend

댓글을 달아 주세요

  1. ruser 2017.04.15 21:19  댓글주소  수정/삭제  댓글쓰기

    항상 잘 보고 있습니다. 파이썬도 추가 되었군요, 함께 하겠습니다. ^^
    근데 제가 fwf 관련해서 궁금한 것이 있는데요,
    오라클 같은 DB에서는 컬럼의 길이를 설정할 때, 바이트로 따지는 것 같더라구요.
    이 때문에 해당 컬럼에 더블-바이트 문자인 한글을 입력하면 글자 하나당 2자리를 차지하게 되는데요, 여기서 이런 식으로 DB에서 생성된 데이터파일과(txt 등) 고정길이에 대한 메타데이터를 가지고 R의 read.fwf 등을 활용할 경우 컬럼 구분이 꼬일 수가 있더라구요.

    예를 들면 DB에서 길이 할당을 10으로 한 varchar2 컬럼에 한글로 "바나나"가 입력된 경우에,
    DB는 "바나나"를 6자리로 읽고 나머지를 스페이스 4자리로 해서 10자리를 채우는데,
    R에서는 "바나나"를 3자리로 읽고 나머지를 스페이스 4자리를 더해서 총 7자리로 읽어버리는 것이죠.

    혹시 이런 문제에 대한 해결 방법을 아시나요?

    LaF, readr 등 생소한 R 패키지들을 찾아보고 있는데, 좀처럼 답을 찾기가 어렵네요,,

    • R Friend R_Friend 2017.04.17 22:43 신고  댓글주소  수정/삭제

      안녕하세요 ruser님, R이랑 Python 사용하신다니 반갑니다.

      저는 질문해주신 것과 같은 문제를 겪어보지는 못해서요, 정확히는 모르겠는데요, 그냥 떠오르는 아이디어를 적어보자면요,

      R로 dbConnet 해서 할게 아니라 그냥 DB에서 text 파일로 exporting을 먼저 한 후에, R에서 read.fwf() 함수로 외부파일 불러오기를 하면 어떨까 싶은데요.

      DB에서 text 파일로 exporting할 때 white space 없어지게 해놓고, 한번 정돈된 text 파일을 R이 읽어오면 될거 같은데요. 제가 문제를 잘 이해하고 답변을 쓴건지 장담 못하겠네요. ^^;

  2. 박정욱 2017.05.08 15:56  댓글주소  수정/삭제  댓글쓰기

    항상 잘보고 공부하고 있습니다. 궁금한 점이 있어 문의 드립니다.

    매일 매일 하기와 같은 파일 이름으로 저장이 되는데

    T_Speed1_20170505, T_Speed1_20170506, .......

    T_Torque1_20170505, T_Torque1_20170506, ......

    이런한 파일이 10개정도 됩니다.이것을 파일 합치기를 적용하고 합니다.

    X <- c(20170505)

    data3 <- read.csv("Y:/SMART FACTORY/4. R data/file/T_Speed1_20170505.csv",header = TRUE, stringsAsFactors = F)

    data4 <- read.csv("Y:/SMART FACTORY/4. R data/file/T_Torque1_20170505.csv",header = TRUE, stringsAsFactors = F)

    T_Speed1_X,T_Torque1_X로 X라는 변수로 지정 가능 할까요??

    이게 안되면 어떤한 방법이 있을까요??





    • R Friend R_Friend 2017.05.08 17:01 신고  댓글주소  수정/삭제

      안녕하세요 박정욱님,

      아래에 포스팅해놓은 글 참고하시기 바랍니다.

      (1) '폴더 내 여러개 파일들을 Loop 돌려서 자동으로 불러와서 하나의 객체로 합치기'
      => http://rfriend.tistory.com/219

      (2) assign 함수를 사용해서 객체의 이름에 다른 이름 추가하기
      => http://rfriend.tistory.com/108