LoginSignup
1
0

More than 3 years have passed since last update.

SAS/RでSQL エピソードⅠ : Group By処理

Last updated at Posted at 2020-07-03

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データセット)を使って試す
class.PNG

AGEごとにレコード数をカウントする例

SAS SQLプロシジャ

proc Sql;
  create table work.CLASS_STAT as
    select AGE , count(*) as N
    from sashelp.CLASS
    group by AGE;
quit;

stat.PNG

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で平均

cccc.PNG

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での比較もしていく予定

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0