2016-03-26 16 views
0

Tablodaki bazı koşullara göre her kayıt için ayrı hücre değerleri atamalıyım. resimde Tablodaki bazı koşullara göre her kayıt için ayrı hücre değerleri nasıl atanır?

Table

, column1= elig, column2=status, column3= type, column4 =metro, column5=quartile, column6=urb, column7=cell. Daha sonra yazdığım ilk 3 koşul (eğer başka bir masadan geliyorlarsa). Ben değişken `dörttebirlik URB ve türünü kullanmaya başladığınızda

Ama yazdıklarımı daha iyi bir kod gerekir.

  • metro 14 arasında artırır olacaktır.
  • Diğer kayıtlarla birlikte dörtlü artışlar.
  • Grup olarak değişiklik yapar. ilk blok type = 1 için

, ikinci blok type maybe be 4 or 5 için (ille artan). Sonraki tip grubu type 7,8,9,10 olabilir.

her kayıt için sadece hücre değeri değişir. Adları kısaltmak ve yazmayı kaydetmek için makro varsayı değiştirebileceğimi biliyorum ancak bu kodu nasıl daha kompakt ve daha verimli hale getirebilirim.

Şimdiden çok teşekkürler.

If elig=0 then cell=0; 

else if elig =1 then 
do; 
    if status in ('2','3') then cell=1; 
    else if (status = ' ' and typec=25) then cell =2; 
    else if (status ='1','4','') and (quartile = .) then cell=2; 
end; 

    else if elig= '1' and type =1 and metro eq='1' then 
do; 
     if quartile = 1 and urb in ('1','2') then cell =1111; 
else if quartile = 1 and urb = '3' then cell =1112; 
else if quartile = 2 and urb in ('1','2') then cell =1121; 
else if quartile = 2 and urb = '3' then cell =1122; 
else if quartile =3 and urb in ('1','2') then cell =1141; 
else if quartile = 3 and urb = '3' then cell =1142; 
else if quartile = 4 and urb in ('1','2') then cell =1121; 
else if quartile = 4 and urb = '3' then cell =1172; 
end; 
/*here will be 3 more blocks of code for metro =2,3,4*/
/*note type changes value after metro cycles through 4 iterations*/ 

    else if elig='1' and type =('4','5') and metro eq='1 then 
do; 
if quartile = 1 and urb in ('1','2') then cell =1211; 
else if quartile = 1 and urb = '3' then cell =1212; 
else if quartile = 2 and urb in ('1','2') then cell =1221; 
else if quartile = 2 and urb = '3' then cell =1222; 
else if quartile =3 and urb in ('1','2') then cell =1241; 
else if quartile = 3 and urb = '3' then cell =1242; 
else if quartile = 4 and urb in ('1','2') then cell =1271; 
else if quartile = 4 and urb = '3' then cell =1272; 
end; 
/*3 more blocks of code for metro =2,3,4*/
/*then type changes and metro=1 and so on*/ 
else if elig='1' and type type =('7','8') and metro eq=1 then 
    do; 
/*more code until my groups end*/
    end; 
+0

Bazı örnek giriş ve çıkış verilerini gönderir misiniz? – Reeza

+0

İlk tablonun bir resmini type = 1 olarak ekledim, tip değişikliklerini not al, bunun gibi gruplandırılmış. Type = 1, type = (4,5,6), Type = (7,8,9,10,11) – user601828

+1

Verilerinizi yazmamaktan kesinlikle eminim. Bu tabloyu oluşturmanızı öneririm. IF/THEN ifadeleri yerine birleştirme yoluyla bir arama yapmak. Bahse girerim ki, kodun belirlenmesine yardımcı olabilecek formülün atanmasına matematiksel bir mantık var, ama şu anda bunu göremiyorum. – Reeza

cevap

0

Gönderdiğiniz verilerin görünümünden, orijinal değişkenlerinizi yeniden gözden geçirmeniz ve sonuçları birleştirmeniz yeterlidir.

örn.

data out_data; 
    set in_data; 
length class_12 $2 class_3 class_4 $1 class $4.; 

select (type); 
    when (1) 
    do; 
     select (metro); 
      when (1) class_12 = '11'; 
      when (2) class_12 = '12'; 
      when (3) class_12 = '14'; 
      otherwise; 
     end; 
    end; 
    when (4, 5) 
     do; 
     select (metro); 
      when (1) class_12 = '21'; 
      when (2) class_12 = '22'; 
      when (3) class_12 = '24'; 
      otherwise; 
     end; 
    end; 
    otherwise; 
end; 
select (quartile); 
    when (1) class_3 = '1'; 
    when (2) class_3 = '2'; 
    when (3) class_3 = '4'; 
    when (4) class_3 = '7'; 
    otherwise; 
end; 
select (urb); 
    when (1, 2) class_4 = '1'; 
    when (3) class_4 = '2'; 
    otherwise; 
end; 
class = class_12||class_3||class_4; 
run; 

Ek koşullarınızı ekleyin ve gerekirse diğer değişkenleri tanıtın.

+0

Önerileriniz için teşekkürler, deneyeceğim ve size bildireceğim. – user601828

İlgili konular