SASやRでもSQL構文を使える!
SASならSQLプロシジャ、RならsqldfというパッケージにてSQLの構文が使えるしdbConnectでデータベースにアクセスしてSQL操作も可能
つまり、データの入出力さえググれば、あとはSQL使ってSASだろうがRだろうがデータのハンドリングや要約統計量を求めることが可能
もちろん、グラフ描くとかpdfできれいに出すとかってなるといろいろ知ってないと難しいが…
pythonもsqlite3とかpandasqlあるから、SQL知ってるといろんな言語でもデータのハンドリングできちゃう
pythonでSQL:https://qiita.com/saspy/items/2b5aeef91e87cac503e2
※微妙にSQLの構文違ったりするけどね...
とりあえず、sashelpのCLASS(sasデータセット)を使って試す
AGEごとにレコード数をカウントする例
SAS SQLプロシジャ
proc Sql;
create table work.CLASS_STAT as
select AGE , count(*) as N
from sashelp.CLASS
group by AGE;
quit;
R sqldf
#準備(使うパッケージ群)
library(sqldf)
library(sas7bdat)
#読み込み(SASならlibnameで楽できるのだが...)
Sas_Pass <- "sashelp.classを置いたフォルダパス(ファイル名まで含める)"
SASHELP_CLASS <- read.sas7bdat( file = Sas_Pass )
#sqldf
CLASS_STAT <- fn$sqldf(
" select AGE , count(*) as N
from SASHELP_CLASS
group by AGE
" )
# SASのSQLプロシジャだとmeanやavgで平均出せるが、基本的にはSQLはavgで平均
R RSQlite
#準備(使うパッケージ群)
library(sqldf)
library(sas7bdat)
#読み込み(SASならlibnameで楽できるのだが...)
Sas_Pass <- "sashelp.classを置いたフォルダパス(ファイル名まで含める)"
SASHELP_CLASS <- read.sas7bdat( file = Sas_Pass )
# データベースに接続
conn = dbConnect( RSQLite::SQLite() , "" , synchronous = "off" )
# ""を"パス/db名"にするとdbを読み込む(dbがない場合は新規に作成)
#データベースに格納
dbWriteTable( conn , "SASHELP_CLASS_SQL" , SASHELP_CLASS , overwrite = TRUE )
query <- " select AGE , count(*) as N
from SASHELP_CLASS_SQL
group by AGE"
CLASS_STAT <- dbGetQuery( conn , query )
#データベースを閉じる
dbDisconnect(conn)
#条件分岐
case when ...
でif文のような感じで条件分岐して変数作れる
つまり、SASのif文やRのifelse知らなくてもハンドリングできたりする
もちろん、知ってた方がいいし複雑なロジック組むのにSQLだと書きにくいこともある
dataステップの方が個人的には好き
SASとRでの比較もしていく予定