더북(TheBook)

이번에는 setosa에 속하는 데이터에서 Sepal.Length의 평균을 구해보자.

> sqldf("select avg(Sepal_Length) from iris where Species='setosa'")
  avg(sepal_length)
1             5.006
<Note>

R과 달리 SQL에서 ‘.’은 테이블 컬럼명이 될 수 없으므로, Sepal.Length가 아니라 Sepal_Length로 컬럼명을 적어야 한다. 또한, SQL에서 대소문자 구별은 없으므로 Sepal_Length 대신 sepal_length로 적어도 된다.

만약 앞에 보인 작업을 R의 기본 함수들로 수행한다면 subset( )으로 원하는 종의 데이터를 얻은 뒤 mean( )을 적용하면 된다.

> mean(subset(iris, Species == "setosa")$Sepal.Length)
[1] 5.006

종별 Sepal.Length의 평균은 SQL의 group by를 사용해 손쉽게 처리할 수 있다.

> sqldf("select species, avg(sepal_length) from iris group by species")
     Species avg(sepal_length)
1     setosa             5.006
2 versicolor             5.936
3 virginica              6.588

비교를 위해 split( ), sapply( )를 사용해 같은 명령을 실행하는 다음 코드를 살펴보자. R에 아직 익숙하지 않고, SQL에 익숙한 사용자에게는 sqldf( )가 확연히 편한 인터페이스를 제공한다.

> sapply(split(iris$Sepal.Length, iris$Species), mean)
    setosa versicolor virginica
     5.006      5.936     6.588

sqldf 패키지에서는 디스크를 저장소로 사용한다거나 매번 sqldf( )를 수행할 때마다 데이터베이스에 데이터 프레임을 저장했다가 처리하고 삭제하는 대신 한 번 만들어둔 데이터를 재사용하는 등의 많은 최적화가 가능하다.

sqldf는 다양한 저장소를 사용할 수 있으며 기본 데이터 저장소로는 sqlite를 사용한다. 따라서 속도 향상을 위한 인덱스 등을 적절히 사용할 수도 있으며, 데이터베이스 기반 기술을 활용하므로 프로그램의 속도를 매우 빠르게 높일 수 있다.

sqldf에 대한 다양한 활용 예는 sqldf 홈페이지(https://code.google.com/p/sqldf/)의 example 섹션에 실려 있으니 이 역시 참고하기 바란다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.