[R 데이터전처리] read.table()에서 '#' 부호를 문자로 인식해서 읽어오고 싶을 때, "Error in scan line 3 did not have 5 elements" 에러가 날 때 : comment.char = ""
R 분석과 프로그래밍/R 데이터 전처리 2017. 4. 15. 23:58요즘 하도 바빠서 포스팅 못한지 거의 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,
|
이때 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)
|
많은 도움 되었기를 바랍니다.
이번 포스팅이 도움이 되었다면 아래의 '공감~♡'를 꾸욱 눌러주세요. ^^