```Date: Wed, 5 Mar 2008 08:03:13 -0500 Reply-To: Arthur Tabachneck Sender: "SAS(r) Discussion" From: Arthur Tabachneck Subject: Re: Question abount counting strings Comments: To: Guylhem Aznar Guylhem, I, too, probably don't understand what you are trying to do. Does the following provide the result you are seeking to accomplish? data want (drop=want: i j transitions); array want(4); input patient_id \$ states \$; transitions='NH HD HP PH'; call missing (of want:); do i=1 to length(states)-1; do j=1 to 4; if substr(states,i,2) eq scan(transitions,j) then want(j)+1; end; end; nh=want(1); hd=want(2); hp=want(3); ph=want(4); datalines; 124883 NHD 124884 N 124885 NHPHD 124886 NHPHP ; Art --------- On Wed, 5 Mar 2008 11:53:34 +0100, Guylhem Aznar wrote: >Hello > >On 3/4/08, Mike Rhoads wrote: >> So, a "state" is equivalent to a single letter, and a "transition" is >> the combination of 2 adjacent states/letters, right? > >True. > >> If my understanding is correct, I wouldn't bother with regular >> expressions. I would just use a DATA step with a DO-loop to create a >> restructured data set with one record for each patient and transition. > >Sounds like a much better idea. > >I did a minor adaptation to your code, because I did end the >transition (called "parcours in french" with a dot as a terminator >char. > >DATA Transitions; >/* parcours == transition */ >SET Work.Parcours (KEEP=patient_id parcours); > >DO I = 1 TO LENGTH(parcours) - 2; > transition = SUBSTR(parcours,I,2); > OUTPUT; >END; >RUN; > >This gives something like > >patient_id parcours >80465 NHD > >patient_id parcours I transition >80465 NHD 1 NH >80465 NHD 2 HD > >However the result isn't exactly what I expected. > >Ideally, it would create for each patient a list of the transition >found, ie of the 2 consecutive letters in the string, matched by a >count: > >transition >NHD >N >NHPHD > >should give > >transition nh hd hp ph >NHD 1 1 . . >N . . . . >NHPHD 1 1 1 1 >NHPHP 1 . 2 1 > >I guess I would need a transpose somewhere. Yet I wonder how I will be >able to count identical transition in the proc transpose (NHPHP >example : 2 HP transitions) > >> Note that this does not create any records for patients like 124886, who >> have only one state and therefore no transitions. You could modify the >> code to create a record for these patients if necessary. > >No - that's the right way to do. If they are in a continuous state, >they have no transition. > >Guylhem ```

Back to: Top of message | Previous page | Main SAS-L page