2016年12月13日火曜日

グラフにしたいデータセットの欠測値のところでグラフをつなげないようにする話

データに欠測が無かったら、以下を実行するとグラフが出ますね。
(いまどきgplotかよとの指摘は今はご勘弁を…)
data hoge;
    a = 1; Y = 2; output;
    a = 2; Y = 3; output;
    a = 3; Y = 4; output;
    a = 4; Y = 5; output;
    a = 5; Y = 3; output;
    a = 6; Y = 7; output;
    a = 7; Y = 5; output;
    a = 8; Y = 8; output;
    a = 9; Y = 4; output;
run;
proc gplot data = hoge;
    plot Y * A ;
    symbol1 c = black V = dot I = join;
run;


もしデータに欠測があった場合、普通にやるとそこは線でつながります。
data hoge;
    a = 1; Y = 2; output;
    a = 2; Y = 3; output;
    a = 3; Y = 4; output;
    a = 4; Y = 5; output;
    a = 5; Y = 3; output;
    a = 6; Y = .; output;
    a = 7; Y = 5; output;
    a = 8; Y = 8; output;
    a = 9; Y = 4; output;
run;
proc gplot data = hoge;
    plot Y * A ;
    symbol1 c = black V = dot I = join;
run;




欠測のところで線を区切って欲しいときは、skipmissオプションを指定します
data hoge;
    a = 1; Y = 2; output;
    a = 2; Y = 3; output;
    a = 3; Y = 4; output;
    a = 4; Y = 5; output;
    a = 5; Y = 3; output;
    a = 6; Y = .; output;
    a = 7; Y = 5; output;
    a = 8; Y = 8; output;
    a = 9; Y = 4; output;
run;
proc gplot data = hoge;
    plot Y * A /skipmiss;
    symbol1 c = black V = dot I = join;
run;






















2016年12月6日火曜日

次のオブザベーションの値を持ってくる話

月一更新に落ち着いてきましたね。

次のオブザベーションの値を持ってくる方法にはいくつかあると思います。

元のデータと2オブザベーション目から読み込んだデータをマージしたりとか
hashで読みこんだりとかの方法が考えられます。
単純に次のレコードを持ってくるならsetステートメントのpointオプションを使う手もあります
グループ内での次のレコードを持ってくる、とかでしたらhashで読み込むのがよさげですが。

data hoge;
    a = 1; b = 6.0 ; output;
    a = 2; b = 3.0 ; output;
    a = 3; b = 4.0 ; output;
    a = 4; b = 2.0 ; output;
    a = 5; b = 5.0 ; output;
    a = 6; b = 1.0 ; output;
run;



data hoge2;
    set hoge end  = _last;
    _vnext = _n_ + 1;

    if _last = 0 then set hoge( keep = a rename = (a = next_a) ) point = _vnext;
        else call missing(next_a);                                              *-最終obsは次のレコードを持たない;

run;











これで変数aの次のオブザベーションの値を持った変数next_aが出来上がります。
今回は画像あげるテストも兼ねてたんですが大丈夫そうですね