2016-03-26 30 views
2

私は行が識別子であり、列が以下に示すようにフラグを持つテーブルを持っています。各行について特定の値を持つデータセット内の列のインデックスを見つける

ID C1 C2 C3 C4 C5 C6 C7 C8 C9 C10 
17028 0 1 0 0 0 1 0 0 1 0 
17030 1 1 1 0 1 0 0 0 1 0 
17037 0 1 0 0 0 0 0 1 1 0 
17040 1 1 0 0 1 0 0 0 1 0 
17041 0 1 0 0 0 0 1 0 1 0 

、iが値を持つ変数の連結名またはインデックスを表すフラグをしたい= 1

これは私が使用されるコードであるが、しかしで効率少しです仕事を終わらせる。

data temp71; 
set temp7; 
format flag 20.; 
flag=0; 
if c1= 1 then flag=flag+1000000000000000; 
if c2= 1 then flag=flag+100000000000000; 
if c3= 1 then flag=flag+10000000000000; 
if c4= 1 then flag=flag+1000000000000; 
if c5= 1 then flag=flag+100000000000; 
if c6= 1 then flag=flag+10000000000; 
if c7= 1 then flag=flag+1000000000; 
if c8= 1 then flag=flag+100000000; 
if c9= 1 then flag=flag+10000000; 
if c10= 1 then flag=flag+1000000; 
if c11= 1 then flag=flag+100000; 
if c12= 1 then flag=flag+10000; 
if c13= 1 then flag=flag+1000; 
if c14= 1 then flag=flag+100; 
if c15= 1 then flag=flag+10; 
if c16= 1 then flag=flag+1; 
run; 
+0

@Tom私が試したコードを含めました。 – Yuvaraj

答えて

1

数字の代わりに文字変数を使用するほうがよいでしょう。文字変数を使用すると、32,767個のフラグを保持できます。

flagc = cats(of c1-c10); 

あなたは、あなたが唯一の数で15個のフラグを保持することができますベース10を使用しなかった何をしようとした場合

。ベース2を使用した場合、53個のフラグを保持できます。

%let nvars=10; 
data want ; 
    set have ; 
    length flagc $&nvars flag2 flag10 8; 
    format flag2 binary&nvars.. flag10 z&nvars..; 
    flagc = cats(of c1-c&nvars); 
    flag10 = input(flagc,&nvars..); 
    flag2 = input(flagc,binary&nvars..); 
    put id (c1-c&nvars) (1.) +1 flag2 flag10 flagc ; 
run; 

17028 0100010010 0100010010 0100010010 0100010010 
17030 1110100010 1110100010 1110100010 1110100010 
1

注:この解決策は、編集前に投稿されていて、以前試みたものとは異なる結果を提供します。

data have; 
    input ID $ C1 C2 C3 C4 C5 C6 C7 C8 C9 C10; 
    datalines; 
17028 0 1 0 0 0 1 0 0 1 0 
17030 1 1 1 0 1 0 0 0 1 0 
17037 0 1 0 0 0 0 0 1 1 0 
17040 1 1 0 0 1 0 0 0 1 0 
17041 0 1 0 0 0 0 1 0 1 0 
; 

data want(drop=i); 
    set have; 
    array C(10); 
    format flag $20.; 
    do i = 1 to 10; 
    if C(i) = 1 then flag = catx(",",flag,put(i,1.)); 
    end; 
run; 

proc print data=want; 
    var flag; 
run; 

結果:

Obs flag 
1 2,6,9 
2 1,2,3,5,9 
3 2,8,9 
4 1,2,5,9 
5 2,7,9 
2

あなたは一緒にすべての変数を連結するためにCATの機能を使用することができますが、1行のコードは、あなたのフラグ変数を生成します。

flag = catt(of c1--c10); 

はしかし、あなたはまた、あなたも一緒に名前を連結するcatx機能を使用できるように、変数の名前を望むかもしれないことを示しました。その可能性のある例を次に示します。

data have; 
input ID $ C1 C2 C3 C4 C5 C6 C7 C8 C9 C10; 
cards; 
17028 0 1 0 0 0 1 0 0 1 0 
17030 1 1 1 0 1 0 0 0 1 0 
17037 0 1 0 0 0 0 0 1 1 0 
17040 1 1 0 0 1 0 0 0 1 0 
17041 0 1 0 0 0 0 1 0 1 0 
; 
run; 


data want; 

set have; 
array c(10) c1-c10; 

flag = catt(of c1--c10); 

length names $50.; 

do i=1 to dim(c); 
if c(i)=1 then names=catx(", ", names, vname(c(i))); 
end; 
run; 
+0

@Reeze:これはうまくいきました。ヘルプに感謝します。 – Yuvaraj

関連する問題