2016-03-26 140 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 

對於每一行,我想其表示與值的變量= 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); 

如果您嘗試使用base 10做的事情,那麼您只能在一個數字中保存15個標誌。如果你使用基數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功能,所有的變量串聯起來,一行代碼會產生你的標誌變量。

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

相關問題