728x90
반응형

 요즘 일 때문에 많이 바빴더니 몇 일째 포스트 하지 못했다. 퇴근 후에 취미 생활을 즐기기 위해선, 운동을 하긴 해야겠다.

 이전 포스트에선 csv 파일을 가지고 오는 방법과 인코딩 문제에 대해 다뤄보았다. R을 사용하기 까다롭게 만드는 문제 중 하나가 인코딩 문제이고, 반면에 파이썬은 UTF-8을 기반으로 작성했기 때문에, 위 문제에서 보다 자유로운 편이다.

 R을 사용하다보면, 분석 환경 세팅 난이도는 그리 높지 않은 편인데(오프라인 환경이나 보안이 강한 환경에서도 큰 문제없이 설치가 가능하다), 데이터를 Import(가져올 때), Export(내보낼 때) 문제가 종종 발생한다. 이 문제는 대부분 인코딩 문제 거나, 데이터 자체에 R로 Import 될 때, 문제를 일으킬 수 있는 인자가 있기 때문이다.
(예를 들어 \n과 같은 문자는 줄을 바꾸는 문자인데, 이런 특수한 역할을 하는 문자가 섞인 데이터에선 데이터의 형태가 변형되어 버릴 수 있다. 이 문제는 R에만 국한된 것은 아니지만, 이 기회에 살짝 언급하고 가겠다.)

  이번 포스트에선 R로 엑셀 파일을 가지고 오고 내보내는 방법에 대해 학습해보도록 하겠다.

 

 

엑셀 파일을 R에서 불러와보자.

  • R에서 엑셀 파일을 불러오기 위해선 readxl 패키지를 사용해야한다.
  • read_excel()
    :  엑셀 파일을 읽어오는 함수
  • 주요 parameter
    : read_excel("파일위치/파일이름.확장자", range = "A1:B3": 엑셀 시트 내에서 내가 불러오고자 하는 영역, col_names = TRUE: 첫 행이 컬럼의 이름인지, sheet = 1, 불러올 시트)
    • read_excel의 특징은 자기가 원하는 sheet를 불러올 수 있다는 것이다.
    • read_excel은 Excel의 특징인 시트 내 좌표를 이용해서 내가 원하는 구간만 데이터를 가져올 수 있다. 
library("readxl")
read_excel(file.choose(), col_names = TRUE, range = "A1:D6", sheet = 1)
  • file 이름(워크 스페이스가 기본 경로이며, 다른 경로를 쓰고 사용하고 싶은 경우엔 해당 경로를 추가하면 된다.)
    이번 포스트에선 file.choose()를 넣어보았다.

  • file.choose()를 매개변수로 넣게 되면, 우리에게 익숙한 파일을 불러오는 창을 볼 수 있다.
  • file.choose()는 R에 익숙할수록 딱히 필요 없는 기능이지만, 파일의 경로에 대해 익숙하지 않은 초보에겐 추천하는 기능이다.
    (일단 파일을 불러와야 뭘 해볼 것 아닌가!)
## # A tibble: 5 x 4
##   name  class  math English
##   <chr> <dbl> <dbl>   <dbl>
## 1 사나      1    80      70
## 2 다연      1    85      65
## 3 쯔위      1    70      90
## 4 모모      1    65      60
## 5 예림      2    80      70

 

 

겸사겸사 워크 스페이스 아래에서 경로를 가지고 장난을 쳐보자.

  • 워크스페이스 경로는 D 드라이브의 RWorkSpace 파일이다.
  • 워크스페이스 경로에 손대지 말고, 해당 파일 안에 있는 Data 파일의 exam_exl.xlsx 파일을 불러와보자.

 

library("readxl")
getwd()
## [1] "D:/RWorkSpace"
read_excel("./Data/exam_exl.xlsx", col_names = TRUE, sheet = 1)
  • ./Data 에서 .은 워크스페이스의 경로(정확히는 현 위치)를 의미한다.
## # A tibble: 15 x 6
##    name  class  math English Korean science
##    <chr> <dbl> <dbl>   <dbl>  <dbl>   <dbl>
##  1 사나      1    80      70     65      90
##  2 다연      1    85      65     75      70
##  3 쯔위      1    70      90     65      60
##  4 모모      1    65      60     55      70
##  5 예림      2    80      70     65      55
##  6 현희      2    75      85     60      80
##  7 정은      2    90      60     70      85
##  8 혜원      2    65      80     75      80
##  9 준식      2    75      70     90      65
## 10 재성      3    70      90     65      85
## 11 민철      3    60      85     75      90
## 12 현택      3    75      65     80      70
## 13 현승      3    90      70     65      85
## 14 윤기      3    80      65     90      70
## 15 기훈      3    95      55     85      90
  • 위 방식을 이용하면, 파일 관리를 보다 수월하게 할 수 있다.

 

 

 

 

엑셀 파일로 저장해보자.

  • 엑셀로 파일을 불러왔으니, 이번엔 엑셀로 파일을 내보 내보자.
  • 위에서 사용한 패키지인 readxl은 말 그대로 엑셀을 읽어오는 패키지이기 때문에, 엑셀로 파일을 내보내려면, writexl이라는 패키지를 설치해야 한다.
  • 그러나 가능한 데이터는 엑셀 파일로 저장하지는 말도록 하자(데이터가 엑셀로 와서 어쩔 수 없는 상태에 엑셀을 R로 읽는 것이지, 데이터 관리를 엑셀로 하는 것은 좋지 않다. 이에 대한 내용은 후술 하도록 하겠다.)
  • write_xlsx()
    : 데이터를 엑셀 형태로 저장한다.
  • 주요 parameter
    : write_xlsx(data, path = "경로/파일이름.xlsx")
library("writexl")
data = data.frame(ID = c("A01", "A02", "A03", "A04", "A05"),
                  math = c(60, 80, 70, 90, 65))

write_xlsx(data, path = "./Data/test.xlsx")
  • 위 과정을 거치면 아래와 같이 엑셀 파일이 생성되는 것을 확인할 수 있다.

 

 

 

 

엑셀 파일로 데이터 관리를 하는 것은 좋을까?

 이번 포스트에선 엑셀로 파일을 올리고 내리는 법을 알아보았다. 그런데 과연 엑셀로 파일을 관리할 일이 있을까? 엑셀은 데이터를 관리하는 데 있어서 상당히 많이 사용되지만, 동시에 단점도 많은 툴이기 때문에, 개인적으로 비추한다. 엑셀을 사용할 바에 csv 파일로 파일을 읽고 쓰는 것을 추천한다.

 엑셀의 단점은 다음과 같다.

  • 엑셀에 단위가 매우 큰 숫자를 넣는 경우 E(지수 형태)로 변환이 되어, 실제 값의 정보가 손실된다.

  • 많은 양의 데이터(행이 65,536개 이상)를 관리할 수 없다.

 물론, 위 문제가 R에서 패키지를 이용해서 파일을 불러오고 내보내는 상황에서도 적용되는지 확신은 못하지만, 당신이 R에 익숙해지면 익숙해질수록, 엑셀은 느려 터지고, 불편한 툴이라는 생각이 들어서 자동으로 멀리하게 될 것이다. R은 코드를 통해서 작동하므로, 엑셀보다는 진입장벽이 있긴 하지만, R에 익숙해지고 나면, 속도, 기능 등 모든 면에서 R이 압도적이므로, 엑셀로 파일을 관리하는 일은 사라지게 될 것이다.
(필자는 엑셀로 수정할 바에 차라리 R로 코딩을 하는 것을 선호할 정도로 R은 쉽고 빠르다!)

 

 

 이번 포스트에선 엑셀로 R에 파일을 올리고 내리는 방법에 대해 학습해보았다. 다음 포스트에선 텍스트 파일을 R로 다루는 방법에 대해 학습해보겠다.

728x90
반응형
728x90
반응형

 데이터 분석을 위해선 먼저 분석을 할 수 있는 환경을 만들어야 하고, 그다음엔 분석을 할 데이터를 가지고 와야 한다. 이번 포스트에선 R에서 데이터를 가지고 오는 방법에 대해 학습해보도록 하겠다.

 

데이터 가져오기(Data Import)

  • R은 일반적으로 csv 파일, R 전용 데이터 파일인 RData(확장자: .rda 또는 .rdata), 엑셀 파일 등으로 데이터를 입출력한다.
  • 이외에도 DB, Json, SPSS 파일 등 다양한 형태로 데이터 입출력 관리를 한다.
  • 이번 포스트에서는 csv, RData, SPSS, 엑셀 파일로 데이터를 관리하는 방법에 대해 학습해보도록 하겠다.
  • DB를 통해 데이터를 관리하는 것은 추후 RMySQL 코드를 다루면서 짚고 넘어가도록 하겠다.

 

 

디렉터리(Directory) 확인하기.

  • 디렉터리란, 다른 말로 폴더(Folder),  카탈로그(Catalog)라고도 하는데, 디렉터리라는 이 말보다 디렉터리를 부르는 다른 용어인 폴더라는 단어가 더 이해하기 쉬울 수 있다.
  • 디렉터리는 상위 디렉토리(부모 디렉토리)와 하위 디렉토리(자녀 디렉토리)로 구성된 트리 형태의 구조를 가지고 있다.
  • R에서 당신이 확인할 디렉터리는 바로 워킹 디렉토리(Working Directory)이다.
  • 워킹 디렉토리는 R에서 작업하는 파일들이 기본적으로 읽고 쓰이는 공간이다.
  • 디렉토리 관련 기본 코드
    • getwd()
      : 현재 워킹 디렉터리를 확인한다.
    • setwd("폴더 주소")
      : "폴더 주소"로 워킹 디렉토리를 잡아준다.
      ※ 만약 당신이 워킹 디렉터리의 주소를 폴더의 url 주소를 복사 붙여 넣기 한다면, 슬래쉬(/) 역 슬래쉬로(\) 잡혀서 들어가므로, 이를 바꿔주어야 한다.
setwd("D:/Rworkspace")
getwd()
## [1] "D:/Rworkspace"

 

 

 

파일을 가지고 와보자.

  • 파일 경로에 한글이 들어가 있는 경우, 오류가 발생할 수 있으므로, 경로와 대상 파일의 명칭을 반드시 영어로 바꿔주자.
  • list.file()
    : 워킹 디렉터리에 있는 파일 리스트를 가지고 온다.
    (만약 괄호 안에 다른 경로를 넣는다고 하면, 그 경로에 있는 파일 리스트를 가지고 온다.)
  • 파일을 가지고 오는 방법은 다음과 같다.
    (csv, excel, spss, txt, rdata 파일 모두 함수 안에서 파라미터로 불러오고자 하는 파일의 경로나, file.choose()로 파일을 클릭해서 가져올 수 있다. 아래 내용이 잘 이해가 안 될 수 있는데, 일단 넘기고 따라서 학습해보자)
    • 워킹 디렉터리 내 파일을 가지고 오는 경우: "파일명.확장자"
    • 가져오려는 파일의 위치가 가변적인 경우, "파일위치/파일명.확장자"로 불러오기
    • file.choose()를 사용하여 파일을 선택하여 불러오기 
  • R은 기본적으로 제공하는 데이터셋이 있으며, 해당 목록은 data() 함수를 통해서 볼 수 있다.

 

 

csv 파일을 가지고 와보자.

  • CSV(Comma-separated Values)는 말 그대로 쉼표(Comma)로 값들이 구분된 형태이다. 
  • csv 파일은 엑셀, SAS, SPSS, R, Python 등 데이터를 다루는 대부분의 프로그램에서 읽고 쓰기가 가능한 범용 데이터 파일이다.
  • csv 형식은 다양한 프로그램에서 지원하고 엑셀 파일에 비해 용량이 매우 적기 때문에 데이터를 주고받는 경우 자주 사용된다.
  • 단점으로는, csv파일은 쉼표로 구분자가 들어가 있으므로, 데이터 자체에 쉼표가 들어가 있는 경우, 데이터 취급이 곤란해진다(구분자를 탭 문자로 바꾼 TSV 등을 사용한다.)
  • read.csv()
    : csv 파일을 가지고 온다.
  • 주요 Parameter
    : read.csv(file, header = FALSE, sep = ",", na.strings = "NA", stringsAsFactors = TRUE, fileEncoding = "", encoding = "unknown")
    # 파일 이름 / 첫 행을 헤더로 처리하여, 컬럼의 이름으로 할지 여부 / 구분자 / 데이터에 결측 값이 있는 경우 대응시킬 값 지정 / 문자열을 펙터로 가지고 올지 여부 / 가지고 오는 파일의 인코딩 / 문자열을 표시할 때의 인코딩
  • stringsAsFactors는 가능한 FALSE로 하여 가지고 오자(Default = TRUE)이다. 만약, 디폴트 값 그대로 가지고 온다면, 모든 문자형이 Factor로 들어오기 때문에, 텍스트 데이터를 조작하기가 꽤 어려워진다. 만약, 텍스트 데이터가 단순한 범주형 척도로써 존재한다면, TRUE로 가지고 와도 큰 문제가 없다.
  • write.csv()
    : csv 파일로 저장한다.
  • 주요 Parameter
    : write.csv(data, file="", row.names=TRUE, encoding = "unknown")
    # 파일로 저장할 데이터 / 데이터를 저장할 파일명(경로) / 행 이름을 csv 파일에 포함하여 저장할지 여부 / 파일을 어떤 인코딩으로 저장할지
  • 먼저 list.files()를 실시하여, 워킹 디렉터리에 위치한 파일의 정확한 이름을 확인하자.

 

 

워킹 디렉터리에서 파일 이름으로 파일을 가지고 와보자.

  • list.files()를 보고 직접 타이핑해서 가지고 오자.
# 워킹 디렉토리에 있는 파일을 리스트업 해보자.
list.files()
##[1] "asdfsadf.html"      "asdfsadf.Rmd"       "exam_csv.csv"         "exam_exl.xlsx"      "exam_spss.sav"      "kyrbs2016.sav"     
##[7] "old_2011.csv"       "sda.html"           "sda.Rmd"            "ypdata_new_w10.sav"
  • 위 파일들에서 exam_csv.csv라는 csv 파일을 가지고 와보자.
  • 해당 csv 파일은 Office 365의 Excel을 이용해서 만든 파일이며, 파일의 구조는 아래 사진과 같다. 

  • 해당 파일을 불러와보자.
read.csv("exam_csv.csv", header = TRUE, sep = ",", na.strings = "NA", stringsAsFactors = TRUE)
##Error in type.convert.default(data[[i]], as.is = as.is[i], dec = dec, : '<82><82><98>'에서 유효하지 않은 멀티바이트 문자열이 있습니다
  • 자 아주 간단한 파일이지만, 갑자기 "Error in type.convet.default(data[[i]], as.is = as.is[i], dec = dec, : '<ec><82><ac><eb><82><98>' 에서 유효하지 않은 멀티바이트 문자열이 있습니다."라며 오류가 뜬다!
  • 위 오류가 발생한 이유는, office 365 엑셀의 인코딩 문제인데, 일반적으로는 fileEncoding과 encoding 파라미터를 손봐주면 된다.
  • 한글에 관련된 인코딩은 크게 3개가 있다.
    • utf-8
    • CP949
    • euc-kr
  • 아래와 같이 인코딩 파라미터를 잡아줘서 해결해보자.
  • 엑셀 파일을 저장할 때, CSV UTF-8(쉼표로 분리)(*.csv)로 해주었다.
read.csv("exam_csv.csv", header = TRUE, stringsAsFactors = TRUE, fileEncoding = "UTF-8", encoding = "CP949")
## Error in read.table(file = file, header = header, sep = sep, quote = quote, : 입력에 가능한 라인들이 없습니다
  • 위와 같은 또 다른 에러가 뜨면서 읽어오질 못하였다.
  • 위 문제 해결 방법은 아주 단순 무식하지만 확실한 방법과 약간 고급진 방법 2가지가 있다.

 

 

단순한 방법으로 해결해보자.

  • 위 문제는 오피스 365 엑셀에서만 발생하는 문제인데, 오피스 365를 쓰지 않으면, 애초에 발생하지 않는다.
  • csv는 ","가 구분자로 작용하여, 단어와 단어를 구분하는 형태이다.
  • 그렇다면 엑셀에서 만든 csv 파일을 txt에서 가져와서 인코딩 형태를 바꿔서 저장해보자.
  • 리눅스 환경이라면
    • "file -bi 파일명"으로 파일의 인코딩을 확인하고
    • "iconv -c -f 원래 인코딩 -t 바꿀 인코딩 파일명 > 새로운 파일명"으로 인코딩을 쉽게 바꿔줄 수 있다
  • 윈도우 환경이라면 "마우스 오른쪽 클릭 > 연결 프로그램 > 메모장"을 사용하면, csv 파일을 메모장으로 열 수 있다.

 

  • "파일 > 다른 이름으로 저장"으로 들어가서 인코딩을 확인해보자!
  • 보면 UTF-8(BOM)으로 돼있는데, 이 BOM이 문제다!
  • 인코딩을 UTF-8 또는 ANSI로 바꿔보자

 

  • 인코딩을 UTF-8로 한다면, fileEncoding 파라미터를 "UTF-8"로 바꾸면 된다.
  • 인코딩을 ANSI로 한다면, 따로 파라미터를 잡아주지 않아도 된다(CP949나 euc-kr)로 잡아줘도 된다.
    (인코딩에 대해서는 개념으로 추후 다시 한번 다루도록 하겠다.)
list.files()
##  [1] "asdfsadf.html"         "asdfsadf.Rmd"          "exam_csv.csv"         
##  [4] "exam_csv_ANSI.txt"     "exam_csv_encoding.txt" "exam_exl.xlsx"        
##  [7] "exam_spss.sav"         "kyrbs2016.sav"         "old_2011.csv"         
## [10] "sda.html"              "sda.Rmd"               "ypdata_new_w10.sav"
read.csv("exam_csv_ANSI.txt", header = TRUE, stringsAsFactors = TRUE)
##    name class math English Korean science
## 1  사나     1   80      70     65      90
## 2  다연     1   85      65     75      70
## 3  쯔위     1   70      90     65      60
## 4  모모     1   65      60     55      70
## 5  예림     2   80      70     65      55
## 6  현희     2   75      85     60      80
## 7  정은     2   90      60     70      85
## 8  혜원     2   65      80     75      80
## 9  준식     2   75      70     90      65
## 10 재성     3   70      90     65      85
## 11 민철     3   60      85     75      90
## 12 현택     3   75      65     80      70
## 13 현승     3   90      70     65      85
## 14 윤기     3   80      65     90      70
## 15 기훈     3   95      55     85      90
  • 위 방법이 가장 간단하면서도 조금 무식한 해결책이라고 할 수 있다.
  • 데이터도 정상적으로 잘 출력되었다.

 

 

 

조금 고급진 방법으로 해결해보자.

  • 개인적으로는 위의 방법을 추천하지만, 경우에 따라서 좀 더 고급진 방법을 써야 할 수도 있을 것이다.
  • 위 인코딩 문제는 간단하게 말해서 Windows에서 한글이 제대로 인식이 안되고, RStudio에서도 한글이 인식이 제대로 안돼서 발생하는 문제라고 할 수 있는데, R의 System 설정을 손대는 함수 중 언어를 손대는 함수인 Sys.locale()을 이용해서 이를 해결할 수 있다.
  • Sys.setlocale()
    : 로케일을 설정하는 함수로, 로케일은 사용자의 언어, 사용자 인터페이스의 언어를 정해주는 함수이다.
  • 주요 Parameter
    : Sys,setlocale(category = "LC_ALL", locale = "")
Sys.setlocale("LC_ALL", "C") # 언어를 제거해버리자
data = read.csv("exam_csv.csv", header = TRUE, stringsAsFactors = TRUE, encoding = "UTF-8")
data
##       X.U.FEFF.name class math English Korean science
## 1  <U+C0AC><U+B098>     1   80      70     65      90
## 2  <U+B2E4><U+C5F0>     1   85      65     75      70
## 3  <U+CBD4><U+C704>     1   70      90     65      60
## 4  <U+BAA8><U+BAA8>     1   65      60     55      70
## 5  <U+C608><U+B9BC>     2   80      70     65      55
## 6  <U+D604><U+D76C>     2   75      85     60      80
## 7  <U+C815><U+C740>     2   90      60     70      85
## 8  <U+D61C><U+C6D0>     2   65      80     75      80
## 9  <U+C900><U+C2DD>     2   75      70     90      65
## 10 <U+C7AC><U+C131>     3   70      90     65      85
## 11 <U+BBFC><U+CCA0>     3   60      85     75      90
## 12 <U+D604><U+D0DD>     3   75      65     80      70
## 13 <U+D604><U+C2B9>     3   90      70     65      85
## 14 <U+C724><U+AE30>     3   80      65     90      70
## 15 <U+AE30><U+D6C8>     3   95      55     85      90
Sys.setlocale("LC_ALL", "Korean") # 언어를 한글로 바꾸자.
## [1] "LC_COLLATE=Korean_Korea.949;LC_CTYPE=Korean_Korea.949;LC_MONETARY=Korean_Korea.949;LC_NUMERIC=C;LC_TIME=Korean_Korea.949"
data
##    X.U.FEFF.name class math English Korean science
## 1           사나     1   80      70     65      90
## 2           다연     1   85      65     75      70
## 3           쯔위     1   70      90     65      60
## 4           모모     1   65      60     55      70
## 5           예림     2   80      70     65      55
## 6           현희     2   75      85     60      80
## 7           정은     2   90      60     70      85
## 8           혜원     2   65      80     75      80
## 9           준식     2   75      70     90      65
## 10          재성     3   70      90     65      85
## 11          민철     3   60      85     75      90
## 12          현택     3   75      65     80      70
## 13          현승     3   90      70     65      85
## 14          윤기     3   80      65     90      70
## 15          기훈     3   95      55     85      90
  • 위 방법을 통하면, RStudio에서 출력되는 언어를 제거하고, 다시 한글로 출력시켜서, 우리가 원하는 결과가 도출되게 할 수 있다.
  • 개인적으로는 텍스트 파일로 열어서 인코딩을 바꾸는 방법이 쉬우니, 해당 방법을 추천한다.
  • 해당 오류는 오피스 365 버전에서만 발생하는 것으로 확인하였다(다른 버전에서도 발생하는 것은 아직까진 보지 못했다...)

 

 

 

이번엔 CSV 파일 형태로 내보 내보자.

  • write.csv()
    : 데이터를 csv 형식으로 저장한다.
  • 주요 parameter
    : write.csv(data, file = "파일 경로", quote = TRUE, row.names = TRUE, fileEncoding = "")
    # 저장하고자 하는 데이터, 파일의 경로, 문자형 데이터에 ""따옴표를 넣는다, 행 이름을 넣는다, 저장하는 파일의 인코딩
  • 위 parameter만 알아도 csv를 다루는데 큰 문제는 없으나, csv는 굉장히 자주 쓰게 될 파일 형식이므로, F1을 눌러서 자세한 설명을 보도록 하자.
data = data.frame(ID = c("A01", "A02", "A03", "A04", "A05"),
                  math = c(60, 80, 70, 90, 65))

write.csv(data, "test.csv", quote = TRUE, row.names = FALSE, fileEncoding = "CP949")

 

  • 위 코드를 실행하면, 워크스페이스에 내가 원하는 data가 내보내진 것을 볼 수 있다.

 

 

 이번 포스트에선 CSV 파일을 여는 방법과 인코딩 문제에 대해 학습해보았다. 인코딩 문제는 당신이 한국인이고, R을 다룬다면, 지겹게 마주할 수 있는 문제이며, 위의 방식에서 크게 벗어나질 않는다.

 다음 포스트에선 엑셀 파일을 가지고 오는 방법과 파일 경로를 이용해서 파일 관리를 하는 법을 간략하게 다뤄보자.

728x90
반응형

+ Recent posts