한국에서는 워낙 윈도우가 압도적으로 사용되는 곳입니다. 그래서 맥을 사용하는 사람 입장에서는 윈도우에서 만든 기본적인 자료, txt나 csv 형식 자료를 읽는데 가끔 문제가 생기기도 합니다. 물론 맥에서 작업하던 파일을 윈도우에 가져와 작업하려면 문제가 많이 발생합니다.
R을 사용할 때도 문제가 많이 생깁니다. 이는 파일에 들어가는 글자를 어떤 형식으로 구성하느냐 하는 문제, 즉 인코딩 문제 때문입니다. 일반적으로 윈도우는 euc-kr를 사용하고, 반면에 맥이나 리눅스는 utf-8을 사용하기 때문입니다.
이 문제를 극복하기 위한 여러가기 꼼수가 있었지만, R에서 이를 처리하는 함수를 하나 만들어서 처리하는 방식이 있어서 소개하고자 합니다. 이 방법은 r에서 한글문서 열때 인코딩 문제 에 소개된 것입니다. 뭐 이 글의 아이디어를 제가 했기 때문에 여기에 소개해도 무방할 것 같네요 ^^;
뭐 사용하는 방법은 간단합니다. 우선 이 함수를 사용하기 위해서 library(readr)
을 입력합니다. 만약 에러가 난다면, install.packages("readr”)
이라고 실행해서 패키지를 설치합니다. 패키지가 설치가 안 되면 R을 최신 것으로 설치하시면 됩니다. 그리고 다음과 같이 함수를 입력합니다. 전체 과정은 다음과 같이 하시면 됩니다.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
library(readr) | |
read.any <- function(text, sep = "", …) { | |
encoding <- as.character(guess_encoding(text)[1,1]) | |
setting <- as.character(tools::file_ext(text)) | |
if(sep != "" | !(setting %in% c("csv", "txt")) ) setting <- "custom" | |
separate <- list(csv = ",", txt = "\n", custom = sep) | |
result <- read.table(text, sep = separate[[setting]], fileEncoding = encoding, …) | |
return(result) | |
} |
R을 많이 사용하신 분은 어떻게 사용할지 감을 잡으셨겠지만, 저와 같은 초보자를 위해서 한 번 사용해보겠습니다. 우선 다음 링크를 눌러서 사용할 샘플자료를 다운 받으세요! 바로 저장하시면 됩니다.
이 자료에 들어 있는 2017_7_8_KBO_win.csv
파일을 R에서 자료를 읽을 수 있는 폴더에 넣으세요. R에서 dir()
을 입력했을 때, 위 파일 이름이 있는지 확인하세요.
맥에서 이 파일을 읽는 진행과정은 다음과 같습니다. 처음에는 read.csv()
을 사용해서 읽는데 실패했던 파일이 read.any()
을 이용해서는 성공하네요.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
> temp_kbo <- read.csv("2017_7_8_KBO_win.csv", header = TRUE) | |
Error in make.names(col.names, unique = TRUE) : | |
'<bc><f8><c0><a7>'에서 유효하지 않은 멀티바이트 문자열이 있습니다 | |
> library(readr) | |
> read.any <- function(text, sep = "", …) { | |
+ encoding <- as.character(guess_encoding(text)[1,1]) | |
+ setting <- as.character(tools::file_ext(text)) | |
+ if(sep != "" | !(setting %in% c("csv", "txt")) ) setting <- "custom" | |
+ separate <- list(csv = ",", txt = "\n", custom = sep) | |
+ result <- read.table(text, sep = separate[[setting]], fileEncoding = encoding, …) | |
+ return(result) | |
+ } | |
> temp_kbo <- read.any("2017_7_8_KBO_win.csv", header = TRUE) | |
> head() | |
Error in head.default() : 기본값이 없는 인수 "x"가 누락되어 있습니다 | |
> temp_kbo <- read.any("2017_7_8_KBO_win.csv") | |
> head(temp_kbo) | |
V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 | |
1 순위 선수명 팀명 AVG G PA AB R H 2B 3B HR TB RBI SAC SF | |
2 1 김선빈 KIA 0.38 79 303 271 49 103 23 0 2 132 47 2 4 | |
3 2 최형우 KIA 0.37 80 359 289 66 107 23 3 20 196 76 0 4 | |
4 3 나성범 NC 0.359 61 264 237 53 85 20 1 13 146 51 0 1 | |
5 4 김태균 한화 0.353 61 268 232 34 82 13 0 10 125 57 0 4 | |
6 5 서건창 넥센 0.353 78 347 303 52 107 17 2 4 140 49 0 3 | |
> temp_kbo <- read.any("2017_7_8_KBO_win.csv",header = TRUE) | |
> head(temp_kbo) | |
순위 선수명 팀명 AVG G PA AB R H X2B X3B HR TB RBI SAC SF | |
1 1 김선빈 KIA 0.380 79 303 271 49 103 23 0 2 132 47 2 4 | |
2 2 최형우 KIA 0.370 80 359 289 66 107 23 3 20 196 76 0 4 | |
3 3 나성범 NC 0.359 61 264 237 53 85 20 1 13 146 51 0 1 | |
4 4 김태균 한화 0.353 61 268 232 34 82 13 0 10 125 57 0 4 | |
5 5 서건창 넥센 0.353 78 347 303 52 107 17 2 4 140 49 0 3 | |
6 6 이대호 롯데 0.351 79 333 302 44 106 7 0 16 161 60 0 0 |