2017-05-19 18 views
0

以下のデータがあります。SAS - ID列の値に基づいて単一の列を2つに分割します

data have; 
    input group replicate $ sex $ count; 

datalines; 
1 A F 3 
1 A M 2 
1 B F 4 
1 B M 2 
1 C F 4 
1 C M 5 
2 A F 5 
2 A M 4 
2 B F 6 
2 B M 3 
2 C F 2 
2 C M 2 
3 A F 5 
3 A M 1 
3 B F 3 
3 B M 4 
3 C F 3 
3 C M 1 
; 
run; 

私は性別に基づいて2つの別々の列にcount列を壊したいです。

            count_ count_ 
        Obs group replicate female  male 

        1  1   A   3   2 
        2  1   B   4   2 
        3  1   C   4   5 
        4  2   A   5   4 
        5  2   B   6   3 
        6  2   C   2   2 
        7  3   A   5   1 
        8  3   B   3   4 
        9  3   C   3   1 

これは最初sexの各レベルのための2つの別々のデータセットを作成し、マージを実行することによって行うことができます。

data just_female; 
    set have; 
    where sex = 'F'; 
    rename count = count_female; 
run; 

data just_male; 
    set have; 
    where sex = 'M'; 
    rename count = count_male; 
run; 

data want; 
    merge 
    just_female 
    just_male 
    ; 
    by 
    group 
    replicate 
    ; 

    keep 
    group 
    replicate 
    count_female 
    count_male 
    ; 
run; 

変数をソートしたり、明示的にドロップ/保持する必要がない冗長な方法はありますか?

答えて

1

これはproc transposeを使用して行うことができますが、データを並べ替える必要があります。私はこれがあなたが探しているものだと信じています。

proc sort data=have; 
by group replicate; 
run; 

データがソートされました。これで、転位用にby-groupが割り当てられました。その後

proc transpose data=have out=want(drop=_name_) prefix=count_; 
by group replicate; 
id sex; 
var count; 
run; 

proc print data=want; 

あなたが得る:

Obs group replicate count_F count_M 

1  1   A   3   2 
2  1   B   4   2 
3  1   C   4   5 
4  2   A   5   4 
5  2   B   6   3 
6  2   C   2   2 
7  3   A   5   1 
8  3   B   3   4 
9  3   C   3   1 
関連する問題