2015-06-14 5 views
0
**Application_id    Reaon_code   Value** 
123        AB31AB45    £500 
124        AB43RD49TY87   £640 
125        RT87     £900 
126        CD19RV29    £1000 

То, что я хочу, чтобы это Отделить reason_code переменная, беря подмножество этого, каждая причина имеет только 4 символа и объединить 2 буквы и 2 номера, всегдаКак разделить одну переменную на несколько строк

Набор данных, который я хочу получить, следующий:

Application_id    Reason_code      Value 
123        AB31       £500 
123        AB45       £500 
124        AB43       £640 
124        RD49       £640 
124        TY87       £640 
145        RT87       £900 

Надеюсь, что это имеет смысл.

второй вопрос, я хочу, чтобы создать показ флага:

Application_id    Reason_code    Value   Waterfall_reason               Unique_Reason 
123        AB31       £500      1 (as it his AB31 first)        0 (as it hits both AB31 and AB45) 
123        AB45       £500      0 (as it hits AB31 first)        0 (as it hits both AB31 and AB45) 
124        AB43       £640      1 (as it hits AB43 first)        0 (as it hits both AB43,RD49 and TY87) 
124        RD49       £640      0               0 
124       TY87       £640      0               0 
145       RT87       £900      1 (as it hits RT87 first)        1 (as it ONLY Hit RT87) 
+1

Привет skybook - пожалуйста, покажите, что вы пробовали до сих пор прояснить свое мышление и то, что может быть полезным для других - а не просто список требований – Bendy

ответ

-1
Data have; 
informat Application_id $3.    Reaon_code $100.   Value NLMNLGBP.; 
input Application_id    Reaon_code   Value; 
Format Value NLMNLGBP.; 
cards; 

123        AB31AB45    £500 
124        AB43RD49TY87   £640 
125        RT87     £900 
126        CD19RV29    £1000 
; 
Data Want; 
format Application_id $3.    Reason_code $4.   Value  NLMNLGBP.; 
set have; 
OrigCode = Reaon_Code; 
Keep Application_id Reason_code Value ; 
Do Start = 1 to 25 by 4;* an arbitrary high number;* you could use a do while or a do until, also.; 
    Reason_code = Substr(Reaon_Code , start , 4) ; 
    if reason_code = '' then leave; 
     output; 
    end; 

run; 
3

Предполагая, что все коды через 4 символов затем простой цикл DO будет делать эту работу. Просто продолжайте брать первые четыре символа, пока строка не будет пустой. Если вы создаете переменную длиной 4 и назначаете ей более длинную строку, тогда будут соответствовать только первые четыре символа. Затем вы можете удалить первые четыре символа до следующего раза через цикл, используя функцию SUBSTR().

data have ; 
    input ID Reason_Code :$20. Value ; 
cards; 
123 AB31AB45 500 
124 AB43RD49TY87 640 
125 RT87 900 
126 CD19RV29 1000 
;;;; 
data want ; 
    set have (rename=(reason_code=reason_list)); 
    length Reason_code $4 Waterfall_reason 8 Unique_reason 8; 
    unique_reason = length(reason_list)<= 4; 
    waterfall_reason= 1; 
    do until (reason_list=' '); 
    reason_code = reason_list ; 
    output; 
    waterfall_reason=0; 
    reason_list = substr(reason_list,5); 
    end; 
run; 
+0

вы могли бы объяснить немного? – yukclam9

0

Вот другой подход с использованием регулярных выражений, основанный на другом предположении, что ваша подстрока на основе букв + цифр, вместо фиксированной установки 4-полукокса. Приведенный ниже код будет подбирать строки, соответствующие шаблону букв + цифры (в этом случае будут содержать 2 буквы + 2 цифры), один за другим, до тех пор, пока вся длина входной строки не будет исчерпана. «waterfall_reason» помечен только после того, как выбрана первая подстрока, а «unique_reason» выполняется countw(), используя буквенную букву в качестве разделителя.

data have; 
    input ID Reason_Code :$20. Value; 
    cards; 
123 ABcd31AB45 500 
124 AB43RD49T87 640 
125 RT87 900 
126 C19RV29 1000 
;;;; 

data want; 
    set have; 
    _pat=prxparse('/[a-z]+[0-9]+/io'); 
    _start=1; 
    _stop=length(reason_code); 
    unique_reason=ifn(countw(reason_code,,'a')=1,1,0); 

    do _n=1 by 1 until (_pos = 0); 
     call prxnext(_pat,_start,_stop,reason_code,_pos,_len); 
     new_code=substr(reason_code,_pos, _len); 
     waterfall_reason=ifn(_n=1,1,0); 

     if not missing (new_code) then 
      output; 
    end; 

    drop _:; 
run; 
+0

Разве нет необходимости определять '_pos' где-нибудь? –