요즘 하도 바빠서 포스팅 못한지 거의 3주째 되어가는것 같네요. ㅜ_ㅜ

게다가 올해 초부터는 Python 연재한다고 R 포스팅은 후순위로 밀려버렸네요. ㅠ_ㅠ

 

오랜만에 R 데이터전처리 영역에서 사용하는 간단한 팁 하나 포스팅하겠습니다.

 

R에서는 '#' 이후의 문자는 모두 무시해버립니다.  있어도 없는 척, 모른 척 해버리는 것이지요. 그래서 '#'을 사용해서 부연설명, 주석을 달면 유용합니다.

 

그런데 말입니다 ('그것이 알고 싶다' 사회자 목소리 버전으로다가.... 자못 심각...-_-;),

 

외부 데이터셋을 read.table() 함수를 사용해서 R로 읽어들이려고 하는데요, 그 외부 데이터셋에 하필이면 '#'이 들어가 있는 겁니다. 아래의 예제 데이터셋처럼 말이지요.  첫번째 행(row)은 변수 이름 (header)이구요, 네번째와 다섯번째 행에 파란색으로 표신된 '#' 부호가 보이시지요? 

 

부가설명을 달기 위한 목적으로 '#'을 썼을 수도 있구요, '#'이 특정 코드값의 하나여서 사용했을 수도 있구요, 입력 실수로 '#'을 썼을 수도 있구요, 이유야 여러가지가 있을 수 있겠습니다.

 

 

[ 원소로 '#' 부호가 들어가 있는 데이터셋 예시]

 

 

 

* 위 예제 데이터셋(comment_char.txt) 첨부 =>   comment_char.txt

 

 

 

위와 같이 데이터셋의 원소로 '#' 문자가 포함된 외부 데이터셋을 read.txt() 함수를 사용해서 읽어들이려고 하면 아래와 같이 '#'이 들어있는 행의 원소의 갯수가 모자란다는 Error 메시지가 뜹니다.

 

"Error in scan line 3 did not have 5 elements"

 

 

> # If dataset contains '#' character, then an error will be raised
> # with a message as follows : "line xx did not have xx elements"
> aa <- read.table("C:/Users/Administrator/Documents/comment_char.txt", 
+                  sep = ",", 
+                  header = TRUE, 
+                  stringsAsFactors = FALSE)
Error in scan(file = file, what = what, sep = sep, 
quote = quote, dec = dec, : line 3 did not have 5 elements

 

 

 

 

이때 fill = TRUE 옵션을 사용해주면 일단 원소가 모자라서 아예 불러들이지 못하는 오류는 피해갈 수 있기는 합니다.  하지만 아래에 aa 라는 이름으로 외부 데이터를 불어와서 만든 데이터프레임을 열어보면 '#'부터 해서 '#' 이후의 원소들은 전부 'NA'로 결측값 처리 되었음을 알 수 있습니다.

 

 

> # Every elements after '#' will be 'NA' because R interprete '#' as a comment character
> aa <- read.table("C:/Users/Administrator/Documents/comment_char.txt", 
+                  sep = ",", 
+                  header = TRUE, 
+                  stringsAsFactors = FALSE, 
+                  fill = TRUE)

 

 

 

 

 

 

만약 '#'을 무시하지 않고 그냥 일반 문자열(string)으로, 문자형(character type)으로 인식해서 있는 그대로 불어들이고 싶다면, 그래서 '#' 뿐만 아니라 '#' 이후의 데이터들도 정상적으로 전부 다 불러읽어오고 싶을 때면 comment.char = "" 옵션을 추가해주면 됩니다.  이러면 fill = TRUE 옵션을 별도로 사용하지 않아도 정상적으로 '#'을 포함하고 있는 데이터셋도 잘 불러들일 수 있습니다.  위의 'aa' 데이터셋(fill = TRUE)과 아래의 'bb' 데이터셋(comment.char = "")을 비교해보시면 쉽게 이해하실 수 있을 겁니다.

 

 

> # It will turn off the interpretaton of comments '#'
> bb <- read.table("C:/Users/Administrator/Documents/comment_char.txt", 
+                  sep = ",", 
+                  header = TRUE, 
+                  stringsAsFactors = FALSE, 
+                  comment.char = "")

 

 

 

 

 


#-------------------

data.table 패키지의 fread() 함수로 '#'이 들어있는 txt 파일을 읽어오니 에러 없이 잘 되네요. 

(댓글로 알려주신 황정용님, 감사합니다)



install.packages("data.table")

library(data.table)

cc <- fread("C:/Users/Administrator/Documents/comment_char.txt", 

            sep = ",", 

            header = TRUE, 

            stringsAsFactors = FALSE)

 



많은 도움 되었기를 바랍니다. 


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

 

 

Posted by R Friend R_Friend

댓글을 달아 주세요

  1. 황정용 2019.05.01 10:53  댓글주소  수정/삭제  댓글쓰기

    열심히 따라해보며 공부하고 있는 학생입니다! 현재
    aa<-fread(file = 'pro1/testdata/comment_char.txt')로 작성을 따라하고 실행하니
    같은오류가 나오지 않고 바로 잘 출력이 되네요.... R버전이 다른 건지 어떤 library가 설치되어있는지..... 오류가 나지 않아서 댓글 달게 되었습니다~

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

      안녕하세요 황정용님,
      fread() 함수로는 이전에 테스트 해보지 못했었는데요, 댓글 남겨주셔서 해보니 에러없이 잘 되네요. 덕분에 저도 좋은 팁 알게 되었습니다.

      댓글 남겨주셔서 감사합니다.

      ps. 예전에 {utils}패키지의 read.table()과 {data.table} 패키지의 fread() 함수 간의 속도 비교했던 포스팅을 썼던 적이 있는데요, 혹시 안보셨다면 참고하시구요.
      => https://rfriend.tistory.com/337