13.1 데이터 불러오기

13.1.1 쉼표로 구분된 텍스트 파일

base 함수인 read.table() 함수를 이용하면 확장자가 .txt탭으로 구분된 텍스트 파일을 불러올 수 있고 쉼표(,)로 구분된 텍스트 파일이나 .csv 파일도 불러올 수 있습니다.

data.table() 함수의 형식은 다음과 같습니다.

read.table(file, header=, sep="", ...)

  • file : 데이터를 읽을 파일의 이름입니다. 경로를 포함합니다. (또한 데이터를 제공하는 웹 페이지 주소도 가능합니다.)
  • header : 첫 줄이 컬럼 제목이면 TRUE값으로 합니다. (기본값은 FALSE 입니다.)
  • sep : 필드 구분 문자를 지정합니다.
  • row.names, col.names : 행, 열 이름을 설정합니다.
  • na.strings : NA 처리를 하고자 하는 문자열을 지정합니다.
  • nrows : 불러올 행의 최대 갯수를 지정합니다.
  • skip : 데이터를 불러올 때 읽지 말아야 할 행의 갯수를 지정합니다.
  • stringsAsFactors : 문자열 컬럼을 요인화 할 것인지를 지정합니다.
  • fileEncoding : 한글 데이터를 불러올 때 “UTF-8”로 지정합니다.

문화체육관광부의 국가도서관통계 중 “전국대학도서관통계 파일” 을 다운받아 data 폴더에 저장하고, 이를 data.table() 함수를 이용해서 불러와 보겠습니다. 다운로드 받은 파일의 이름은 University_Library_20201028.csv 로 첫 줄은 각 컬럼의 제목이 입력되어 있으며, 두번째 줄부터는 각 행의 요소들이 쉼표로 구분되어 있는 파일(csv) 입니다.

# 다운받은 csv 파일을 read.table() 함수로 불러옵니다.
mydata <- read.table("data/University_Library_20201028.csv",   # 불러올 파일의 경로입니다.
                     head = TRUE,                              # 파일의 첫 줄에 컬럼 제목이 있습니다.
                     sep = ",")                                # 각 줄의 항목이 쉼표(,)로 구분되어 있습니다.
str(mydata)
## 'data.frame':    1834 obs. of  9 variables:
##  $ 평가년도  : int  2014 2014 2014 2014 2014 2014 2014 2014 2014 2014 ...
##  $ 도서관구분: chr  "LIBTYPE008" "LIBTYPE008" "LIBTYPE008" "LIBTYPE008" ...
##  $ 도서관코드: int  227 25 269 290 311 340 363 387 408 43 ...
##  $ 면적      : chr  "경북" "대전" "경기" "서울" ...
##  $ 시군구    : chr  "영천시" "서구" "여주시" "종로구" ...
##  $ 장서수    : int  20827 31054 114815 6326 756633 1306474 1611325 136147 4421 1379785 ...
##  $ 사서수    : int  1 1 2 1 6 11 30 2 0 20 ...
##  $ 대출권수  : int  2044 15745 10677 4647 53358 303522 187458 26534 495 123313 ...
##  $ 예산액    : num  3.44e+07 0.00 3.80e+07 7.50e+06 1.05e+08 ...

이때 파일에 BOM (Byte Order Mark)없이 일반 csv 파일로 저장했는지 확인해야 합니다 (한글이 포함된 경우가 여기에 속합니다). 이 작업을 수행한 경우 불러오기 함수에 추가 인수 fileEncoding = "UTF-8-BOM"을 추가하지 않으면 가져온 데이터에 이상한 문자가 표시됩니다. 데이터 파일에 한글이 포함되어 있는 경우는 fileEncoding = "UTF-8"로 지정하지 않아도 한글을 불러옵니다.

불러온 데이터는 ‘data.frame’ 구조로서 1,834 개의 행과 9 개의 변수(컬럼)으로 구성되어 있음을 알 수 있습니다.

탭(\t) 이외의 기타의 구분자(delimiter)로 구분된 파일의 경우도 read.table() 함수의 sep = 인수를 이용하여 불러오기 할 수 있습니다.

13.1.2 CSV 파일 불러오기

일반적으로 .csv 파일은 , 또는 ; 로 데이터의 항목들을 구분하여 저장하고 있습니다.

이 파일을 R로 성공적으로 불러오려면 앞에서 살펴 본 구분 문자(sep =)를 지정하는 read.table() 함수를 사용하거나, read.csv() 또는 read.csv2() 함수를 사용할 수 있습니다. read.csv() 함수는 특히 구분자가 , 인 경우에, 그리고 read.csv2() 함수는 구분자가 ;일 때 사용합니다.

read.csv() 함수와 read.csv2() 함수는 read.table() 함수와 거의 동일하지만 header 인수와 fill 인수가 기본적으로 TRUE로 설정되어 있다는 점에서 read.table() 함수와 차이가 납니다.

read.csv(file, header = TRUE, sep = ",", quote = "\"", dec = ".", fill = TRUE, comment.char = "", ...)

read.csv2(file, header = TRUE, sep = ";", quote = "\"", dec = ",", fill = TRUE, comment.char = "", ...)

  • file : 불러올 데이터 파일의 경로를 포함한 파일명입니다.
  • header= TRUE : 파일의 첫 행을 헤더로 처리하는 것이 기본값입니다.
  • sep = “,” : 구분자가 ,이면 read.csv() 함수, 구분자가 ;이면 read.csv2() 함수를 사용합니다.

앞에서 read.table() 함수로 불러왔던 전국대학도서관정보 파일을 read.csv() 함수로 불러와 보겠습니다.

# csv 파일은 read.csv() 함수로도 불러올 수 있습니다.
mycsv <- read.csv("data/University_Library_20201028.csv")
str(mycsv)
## 'data.frame':    1834 obs. of  9 variables:
##  $ 평가년도  : int  2014 2014 2014 2014 2014 2014 2014 2014 2014 2014 ...
##  $ 도서관구분: chr  "LIBTYPE008" "LIBTYPE008" "LIBTYPE008" "LIBTYPE008" ...
##  $ 도서관코드: int  227 25 269 290 311 340 363 387 408 43 ...
##  $ 면적      : chr  "경북" "대전" "경기" "서울" ...
##  $ 시군구    : chr  "영천시" "서구" "여주시" "종로구" ...
##  $ 장서수    : int  20827 31054 114815 6326 756633 1306474 1611325 136147 4421 1379785 ...
##  $ 사서수    : int  1 1 2 1 6 11 30 2 0 20 ...
##  $ 대출권수  : int  2044 15745 10677 4647 53358 303522 187458 26534 495 123313 ...
##  $ 예산액    : num  3.44e+07 0.00 3.80e+07 7.50e+06 1.05e+08 ...

read.csv() 함수는 read.table() 함수와 달리 head = 인수나 sep = 인수를 지정하지 않아도 되는 것을 알 수 있습니다.

13.1.3 구분자를 포함한 파일 불러오기

탭문자(\t), 쉼표(,) 또는 세미콜론(;) 이외의 다른 구분자가 포함된 파일의 경우 read.delim()read.delim2() 함수를 사용할 수 있습니다. 이것들은 read.csv() 함수와 마찬가지로 read.table() 함수의 변형입니다.

결과적으로, 이 두 함수들은 read.table() 함수와 많은 공통점이 있습니다. 다만, 첫 번째 줄에 속성 이름이 있는 헤더라고 가정하고, 공백, 쉼표 또는 세미콜론 대신 탭을 구분 기호로 사용한다는 차이가 있습니다. 또한 fill = 인수가 TRUE로 설정되어 있어서 길이가 다른 행에 공란이 추가됩니다.

read.delim(file, header = TRUE, sep = "\t", quote = "\"",

dec = ".", fill = TRUE, comment.char = "", ...)

read.delim2(file, header = TRUE, sep = "\t", quote = "\"", dec = ",", fill = TRUE, comment.char = "", ...)

  • file : 불러올 데이터 파일의 경로를 포함한 파일명입니다.
  • header = TRUE : 파일의 첫 행을 헤더로 처리하는 것이 기본값입니다.
  • sep = “\t” : 두 함수 모두 탭문자(\t)를 구분자로 지정하고 있습니다.
  • dec = : 수숫점의 기호를 점(.) 또는 쉼표(,)로 사용하는가가 두 함수의 용도를 달리합니다.

read.delim() 함수와 read.delim2() 함수는 dec = 인수 값에 차이가 있습니다. read.delim() 함수는 소숫점 기호를 점(.)으로 사용하는 경우에, 그리고 read.delim2() 함수는 소숫점 기호를 쉽표(,)로 사용하는 경우에 유용합니다.

13.1.4 엑셀 파일 불러오기

Excel 파일을 읽는 가장 좋은 방법 중 하나는 쉼표로 구분 된 파일(csv)로 내보내고 위의 방법을 사용하여 가져오는 것입니다. 아니면 xlsx 패키지14read.xlsx() 함수를 사용하여 Excel 파일에 액세스할 수 있습니다. 첫 번째 행에는 열 이름이 포함되는 것이 좋습니다. R에서 Excel 파일을 불러오기 전에 Excel을 이용하여 데이터 파일을 열어서 파일의 구조를 미리 확인해 보는 것도좋습니다.

read.xlsx() 함수의 형식은 다음과 같습니다.

read.xlsx( … )

  • file : 불러올 파일명입니다.
  • sheetIndex : 워크북의 시트 색인번호를 지정합니다.
  • sheetName = NULL : 시트 이름을 지정합니다.
  • rowIndex = NULL : 추출하고자 하는 행번호의 정수형 벡터입니다.
  • startRow = NULL : 읽어 들일 행의 시작 색인번호입니다.
  • endRow = NULL : 읽어 들일 행의 마지막 색인번호입니다.
  • colIndex = NULL : 추출하고자 하는 컬럼의 정수형 벡터입니다.
  • as.data.frame = TRUE : 읽어 들인 결과를 데이터 프레임형으로 합니다.
  • header = TRUE : 첫 행이 컬럼 제목입니다.
  • colClasses = NA,
  • keepFormulas = FALSE,
  • encoding = "unknown", : 한글은 UTF-8로 지정합니다.
  • password = NULL

앞의 예에서 데이터 파일을University_Library_20201028.xlsx로 다운로드 했다면, 이를 read.xlsx() 함수를 이용하여 불어로 수 있습니다. 그런데, 경로를 지정할 때 윈도즈에서 사용하는 \ 대신에 /를 사용하고 있습니다.

# 패키지 불러오기
# install.packages("xlsx")
library(xlsx)

mydata1 <- read.xlsx("data/University_Library_20201028.xlsx",   # 불러올 파일의 경로입니다.
                     sheetIndex = 1,                # 읽어들일 시트가 1번입니다.
                     head = TRUE,                   # 첫 줄이 컬럼 제목입니다.
                     encoding = "UTF-8",            # 한글을 UTF-8 코드로 읽어 들입니다.
                     
)                             
str(mydata1)
## 'data.frame':    1834 obs. of  9 variables:
##  $ 평가년도  : num  2014 2014 2014 2014 2014 ...
##  $ 도서관구분: chr  "LIBTYPE008" "LIBTYPE008" "LIBTYPE008" "LIBTYPE008" ...
##  $ 도서관코드: num  227 25 269 290 311 340 363 387 408 43 ...
##  $ 면적      : chr  "경북" "대전" "경기" "서울" ...
##  $ 시군구    : chr  "영천시" "서구" "여주시" "종로구" ...
##  $ 장서수    : num  20827 31054 114815 6326 756633 ...
##  $ 사서수    : num  1 1 2 1 6 11 30 2 0 20 ...
##  $ 대출권수  : num  2044 15745 10677 4647 53358 ...
##  $ 예산액    : num  3.44e+07 0.00 3.80e+07 7.50e+06 1.05e+08 ...

확장자가 xlsx인 엑셀 파일로 불러들이는 것이 csv 파일을 불러올 때 보다 시간이 더 걸리는 것을 확인할 수 있습니다.

그 밖에도 JSON 파일, XML 파일, SPSS, SAS, Stata, systat 등의 파일은 다음과 같이 불러올 수 있습니다. 다만 참고용으로 수록하겠습니다.

### JSON 파일을 불러옵니다.
# install.packages("rjson")
library(rjson)
JsonData <- fromJSON(file = "<filename.json>")          # 파일을 불러옵니다.
JsonData <- fromJSON(file = "<URL to your JSON file")   # 웹 사이트에서 불러옵니다.

### XML 파일을 불러옵니다.
# install.packages("XML")
library(XML)

xmlfile <- xmlTreeParse("URL  to the XML data")         # XML 파일을 불러옵니다.
topxml <- xmlRoot(xmlfile)                              # 불러온 파일의 top node에 접근합니다.
topxml <- xmlSApply(topxml,
                    function(x) xmlSApply(x, xmlValue)) # XML 값들을 추출합니다.
xml_df <- data.frame(t(topxml),row.names=NULL)          # 데이터 프레임으로 변형합니다.

# 위의 과정은 다음과 같이 간단하게 할 수 있습니다.
url <- "<a URL with XML data>"
data_df <- xmlToDataFrame(url)

### HTML의 표를 불러오기 (이 부분은 웹 스크래핑에서 사용하는 방법의 일부입니다.)
# install.packages("RCurl")
library(RCurl)
url <- "<a URL>"                                         # 불러올 URL을 지정합니다.
data_df <- readHTMLTable(url,                            # HTML 표를 읽어옵니다.
                         which=3)                        # HTML의 표가 여러개일 때, 순번을 지정합니다.

# 또는 RCurl 패키지와 XML 패키지를 결합하여 사용할 수 있습니다.                     
library(XML)                                             # 패키지들을 불러옵니다.
library(RCurl)
url <- "YourURL"                                         # url 변수에 URL을 지정합니다.         
urldata <- getURL(url)                                   # 데이터를 불러옵니다.
data <- readHTMLTable(urldata,                           # HTML 표를 불러옵니다.
                      stringsAsFactors = FALSE)

# httr 패키지를 이용할 수도 있습니다.
# install.packages("httr")
library(httr)
urldata <- GET(url)                                       # URL의 데이터를 불러옵니다.
data <- readHTMLTable(rawToChar(urldata$content),         # HTML 표를 불러옵니다.
                      stringsAsFactors = FALSE)

### SPSS 데이터 파일을 불러옵니다.
# SPSS 데이터 세트를 trasport 형식으로 저장합니다.
get file = 'c:\mydata.sav'
export outfile = 'c:\mydata.por'
# install.packages("Hmisc")
library(Hmisc)
sas.data <- spss.get("c:/mydata.por", use.value.labels = TRUE)
str(sas.data)

# 또는 foreign 패키지를 사용할 수도 있습니다.
library(foreign)
mySPSSData <- read.spss("c:\mydata.sav",                      # SPSS 데이터를 불러옵니다.
                         to.data.frame=TRUE,
                         use.value.labels=FALSE)
str(mySPSSData)                       
                         
### SAS 데이터 파일을 불러옵니다.
# SAS 데이터 세트를 trasport 형식으로 저장합니다.
libname out xport 'c:/mydata.xpt';
data out.mydata;
set sasuser.mydata;
# install.packages("Hmisc")
library(Hmisc)
sas.data <- sasxport.get("c:/mydata.xpt")
str(sas.data)

# 또는 sas7bdat 패키지를 이용할 수도 있습니다.
# install.packages("sas7bdat")
library(sas7bdat)
mySASData <- read.sas7bdat("example.sas7bdat")

### Stata 데이터 파일을 불러옵니다.
# install.packages("foreign")
library(foreign)
stata.data <- read.dta("c:/mydata.dta")
str(stata.data)

### systat 데이터 파일을 불러옵니다.
# install.packages("foreign")
library(foreign)
systat.data <- read.systat("c:/mydata.dta")
str(systat.data)

13.1.5 R 형식의 파일 불러오기

R에서는 처리한 데이터를 R 고유의 데이터 형식으로 저장할 수 있습니다. 대표적인 형식이 .rds.Rdata (또는 .rda) 형식입니다. 이렇게 저장된 파일은 readRDS() 함수나 load() 함수로 불러올 수 있습니다.

자세한 내용은 다음의 R 형식으로 저장하기 부분을 참고하기 바랍니다.

13.1.6 키보드 입력

일반적으로 SAS, SPSS, Excel, Stata, 데이터베이스 또는 ASCII 파일을 데이터 프레임으로 불러올 수 있습니다. 그런데 데이터를 키보드를 통해 대화식으로도 입력할 수 있습니다.

# 키보드를 통하여 대화식으로 데이터 프레임에 데이터를 입력할 수 있습니다.
# 먼저 데이터 프레임의 구조를 생성합니다.
data <- data.frame(age = numeric(0),             # age 컬럼을 숫자형으로 지정합니다. 
                   gender = character(0),        # gender 컬럼을 문자형으로 지정합니다.
                   weight = numeric(0))          # weight 컬럼을 숫자형으로 지정합니다.
kbd.data <- edit(data)                           # 데이터 입력을 위한 데이터 편집기 화면이 나타납니다.
                                                 # 데이터 편집기의 [파일]-[닫기]를 선택하면 데이터가 저장됩니다.
str(kbd.data)
## 'data.frame':    0 obs. of  3 variables:
##  $ age   : num 
##  $ gender: chr 
##  $ weight: num

edit(data) 는 사용하는데 조심해야 합니다. 이 스크립트를 실행하면 기존의 데이터가 모두 지워집니다.

13.1.7 DBMS에 접속하기 : ODBC 인터페이스 이용하기

RODBC 패키지는 ODBC 인터페이스를 통해 데이터베이스 (Microsoft Access 및 Microsoft SQL Server 포함)에 대한 액세스를 제공합니다.

주요 함수들을 다음과 같습니다.

함수 설 명
odbcConnect(dsn, uid="“, pwd=”") ODBC 데이터베이스에 대한 연결 열기
sqlFetch(channel, sqtable) ODBC 데이터베이스에서 데이터 프레임으로 테이블 읽기
sqlQuery(channel, query) ODBC 데이터베이스에 쿼리를 제출하고 그 결과를 반환받습니다.
sqlSave(channel, mydf, tablename = sqtable, append = FALSE) ODBC 데이터베이스의 테이블에 데이터 프레임 쓰기 또는 업데이트 (append = True)
sqlDrop(channel, sqtable) ODBC 데이터베이스에서 테이블 제거
close(channel) 연결 종료

RODBC 의 예를 들면 다음과 같습니다. 예로 DBMS에서 두 개의 테이블을 데이터 프레임으로 불러오는 것입니다.

# install.packages("RODBC")
library(RODBC)

# mydsn에 연결합니다.
myconn <-odbcConnect("mydsn",                     # 접속명을 기입합니다.
                     uid="접속ID",                 # 접속 ID를 기입합니다. 
                     pwd="접속비밀번호")            # 접속 비밀번호를 기입합니다.
crimedat <- sqlFetch(myconn, "Crime")             # Crime 테이블을 crimedat로 불러옵니다.
pundat <- sqlQuery(myconn, "select * from Punishment")   # Punishment 테이블을 쿼리합니다.
# mydsn 연결을 종료합니다.
close(myconn)

이외에도 MySQL(RMySQL), Orcle(ROracle), 그리고 JDBC(RJDBC)에 인터페이스 접근도 할 수 있습니다.


  1. 이외에도 readxl, XLConnect 등의 패키지를 이용할 수 있습니다↩︎