SASとRでの、データの結合の比較
SASのデータセットの結合と、Rのデータフレームの結合について
いろいろな方法があると思うが、以下の方法を紹介(縦結合は略)
SASはdataステップのmergeステートメント
Rはdplyrのleft_join,inner_joinなど
また、SASもRもSQLの構文を使える
https://qiita.com/saspy/items/43b4c368d22f45f023a2
SASのデータ結合 mergeステートメント
ソートされている前提
data work.DATA_MERGE_RESULT;
merge
DATA1( in = ds1 )
DATA2( in = ds2 )
;
by キー変数1 キー変数2 ... ;
%* 以下のどれかを使用 *;
%* DATA1にある行を残す場合( SQLでいうleft join ) *;
if ds1 = 1;
%* DATA2にある行を残す場合( SQLでいうright join ) *;
if ds2 = 1;
%* DATA1,DATA2のどちらにもある行を残す場合( SQLでいうinner join ) *;
%* 数学でいう積集合 *;
if ds1 * ds2 = 1;
%* DATA1,DATA2のどれかにある行を残す場合( SQLでいうfull join ),別になくてもいい *;
%* 数学でいう和集合 *;
if ds1 + ds2 >= 1;
%* DATA1だけにある行を残す場合( 数学でいう差集合 ) *;
if ds1 - ds2 = 1;
%* DATA1かDATA2だけにある行を残す場合( 数学でいう対称差 ) *;
if abs( ds1 - ds2 ) = 1;
run;
in=オプションで、指定したデータセットの行なのか判断(値は1か0が入る)
setステートメントでも使えるため、縦結合で元のデータセットを判断するときにも使ったりする
また、SASの場合はソートしてからmergeって流れに注意
(SQL使ったりすればいらなかったりする)
ds2プロシジャやHashなど、いろいろな方法でできるよう
自分の場合ds2は結局SQLでやってるが
Rのデータ結合 dplyrパッケージのleft_joinやinner_joinなど
library(tidyverse)
DATA_MERGE_RESULT <- dplyr::left_join( DATA1 , DATA2 , by = c( "キー変数1" , "キー変数2" ) )
# SQLのように、キー変数の名前が異なる場合でも結合可能
DATA_MERGE_RESULT <- dplyr::left_join( DATA1 , DATA2 , by = c( "DATA1のキー変数1" = "DATA2のキー変数1" , "キー変数2" ) )
left_joinをinner_join,full_join,anti_joinなどに変えれば、あとはSQLと同様の結合が可能
ソート不要