1. list와 dataframe
vector, matrix, array는 한 가지 타입의 값만을 저장할 수 있는 반면
example<-c(1,2,'a','b')
example
[1] "1" "2" "a" "b"
⭐list와 data.frame은 다른 타입의 값을 저장하기 위해 이용할 수 있다.
1) list는 객체로 이루어진 벡터로 생각할 수 있다.
a = 1:5
b = c(TRUE, TRUE, FALSE)
char = "stat"
ex.list<-list(vec1 = a, vec2 = b, vec3 = char)
ex.list
$vec1
[1] 1 2 3 4 5
$vec2
[1] TRUE TRUE FALSE
$vec3
[1] "stat"
각 성분의 이름 또는 인덱스로 성분을 호출할 수 있다.
ex.list[[1]]
[1] 1 2 3 4 5
ex.list$vec1
[1] 1 2 3 4 5
2) data.frame은 관계형 데이터베이스의 테이블(릴레이션)과 같은 구조로 생각할 수 있다.
행과 열로 이루어져 있으며, 각 열 안에서는 같은 타입의 값만을 가질 수 있고,
열 끼리는 다른 타입의 값으로 구성될 수 있다.
ex.df = data.frame(cbind(1:5,5:1))
ex.df
X1 X2
1 1 5
2 2 4
3 3 3
4 4 2
5 5 1
ex.df$X1
[1] 1 2 3 4 5
class(ex.df$X1)
[1] "integer"
ex.df$X2
[1] 5 4 3 2 1
class(ex.df$X2)
[1] "integer"
ex.df[1,1] = "a"
ex.df
X1 X2
1 a 5
2 2 4
3 3 3
4 4 2
5 5 1
1행 1열을 "a"라는 문자로 바꾼 경우
ex.df$X1
[1] "a" "2" "3" "4" "5"
class(ex.df$X1)
[1] "character"
ex.df$X2
[1] 5 4 3 2 1
class(ex.df$X2)
[1] "integer"
1열의 class가 모두 character로 바뀌었다.
2. RMySQL
통계분석 프로그램 R의 RMySQL 패키지: R에서 MySQL의 데이터베이스에 접근하기 위해 사용
# install the package
install.packages("RMySQL")
# load the package
library(RMySQL)
dbConnect( )를 통해 RDBMS 중 MySQL을 사용한다는 선언을 하면서 사용자 이름, 비밀번호, 호스트(localhost 또는 IP), DB이름을 입력한다.
con<-dbConnect(MySQL(),
user='root',
password='0000',
host='localhost',
dbname='sakila')
접속 정보를 보기 위해 summary( )를 이용하고, dbGetInfo( )를 이용해 DB정보를 볼 수 있음.
dbListTables( )를 이용해 접속된 DB의 테이블 이름을 볼 수 있다.
dbListTables(con)
* MySQL에 저장된 DB의 이름인 salika가 아니라 R에서 선언해준 변수인 con을 사용
dbListFields( )를 이용해 특정 테이블 내부의 속성 이름을 볼 수 있다.
dbListFields(con, 'film')
* 테이블의 이름은 따옴표로 묶어주어야 함
데이터 불러오기(Querying Data) - 세 가지 방법
(1) dbReadTable()을 통해 테이블 전체 불러오기
(2) dbGetQuery()를 통해 Query를 보내 결과를 가져오기
(3) dbSendQuery()를 통해 Query를 제출하고 dbFetch()를 통해 결과를 가져오기
(1) dbReadTable
테이블 전체를 불러오기 때문에, 불러오는 테이블에 저장된 데이터의 양이 적을때만 사용하는 것을 추천
dbReadTable(con, 'category')
category<-dbReadTable(con, 'category')
class(category)
[1] "data.frame"
(2) dbGetQuery
dbGetQuery(con, "SELECT * FROM film LIMIT 5;")
MySQL에서의 Query를 따옴표로 묶어 그대로 사용한다.
film<-dbGetQuery(con, "SELECT * FROM film;")
class(film)
[1] "data.frame"
names(film)
[1] "film_id" "title" "description"
[4] "release_year" "language_id" "original_language_id"
[7] "rental_duration" "rental_rate" "length"
[10] "replacement_cost" "rating" "special_features"
[13] "last_update"
dim(film)
[1] 1000 13
주의) SQL Query 내부에서도 따옴표를 사용하는 경우가 있는데 ,전체 Query를 묶어주는 따옴표와 Query 내부에서 사용하는 따옴표를 구별하기 위해 작은따옴표와 큰따옴표를 각각 사용하여야 함.
예를 들어서
dbGetQuery(con, "SELECT COUNT(*) 'Number of epic movies'
FROM film
WHERE description LIKE '%epic%';")
Number of epic movies
1 42
(3) dbSendQuery와 dbFetch
dbSendQuery는 DB Engine으로 Query를 전달하여 수행하지만, 데이터를 불러오지는 않는다.
dbFetch는 dbSendQuery의 결과의 부분집합 전체 또는 일부를 순차적으로 불러온다.
*dbFetch에 n=-1 또는 n=Inf 을 입력해주면, 모든 데이터를 가져온다.
film<-dbSendQuery(con, "SELECT film_id, title FROM film;")
film
<MySQLResult:895790728,0,8>
class(film)
[1] "MySQLResult"
film.data<-dbFetch(film, n=-1)
class(film.data)
[1] "data.frame"
dim(film.data)
[1] 1000 2
전체를 모두 출력하면, dbSendQuery로 전달된 Query의 수행이 끝난 것으로 간주된다.
dbHasCompleted(film)
[1] TRUE
dbFetch의 변수 n을 통해, 순차적으로 결과를 출력할 수 있다.
film<-dbSendQuery(con, "SELECT film_id, title FROM film;")
dbFetch(film, n=1)
film_id title
1 1 ACADEMY DINOSAUR
dbFetch(film, n=2)
film_id title
1 2 ACE GOLDFINGER
2 3 ADAPTATION HOLES
dbHasCompleted(film)
[1] FALSE
다음 dbSendQuery를 실행하기 위해서는 앞의 Query를 종료해야 한다.
dbClearResult(film)
[1] TRUE
R을 끄기 전에 MySQL 접속을 종료하기
dbDisconnect(con)
[1] TRUE