0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

SAS/R データの横結合方法の比較

Last updated at Posted at 2020-07-12

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と同様の結合が可能
ソート不要

0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?