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() 함수로 불러옵니다.
<- read.table("data/University_Library_20201028.csv", # 불러올 파일의 경로입니다.
mydata 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() 함수로도 불러올 수 있습니다.
<- read.csv("data/University_Library_20201028.csv")
mycsv 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
패키지14의 read.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)
<- read.xlsx("data/University_Library_20201028.xlsx", # 불러올 파일의 경로입니다.
mydata1 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.frame(age = numeric(0), # age 컬럼을 숫자형으로 지정합니다.
data gender = character(0), # gender 컬럼을 문자형으로 지정합니다.
weight = numeric(0)) # weight 컬럼을 숫자형으로 지정합니다.
<- edit(data) # 데이터 입력을 위한 데이터 편집기 화면이 나타납니다.
kbd.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)에 인터페이스 접근도 할 수 있습니다.
이외에도
readxl
,XLConnect
등의 패키지를 이용할 수 있습니다↩︎