| Date: | Mon, 21 Feb 2005 17:24:28 -0500 |
| Reply-To: | Ed Heaton <EdHeaton@WESTAT.COM> |
| Sender: | "SAS(r) Discussion" <SAS-L@LISTSERV.UGA.EDU> |
| From: | Ed Heaton <EdHeaton@WESTAT.COM> |
| Subject: | Re: Data step - do loop, if-then-else, output |
|
| Content-Type: | text/plain; charset="us-ascii" |
Sally,
Where are you assigning values to SCORE? I don't see it anywhere.
Here is some slightly modified code that does what your code does.
Ed
Edward Heaton, SAS Senior Systems Analyst,
Westat (An Employee-Owned Research Corporation),
1600 Research Boulevard, RW-3541, Rockville, MD 20850-3195
Voice: (301) 610-4818 Fax: (301) 610-5128
mailto:EdHeaton@Westat.com http://www.Westat.com
/*********************************************************************/
Data temp1 ;
InFile cards ;
Input id rd30d_yn rd1yr_yn wsj nyt bg wp lat ;
Label
wsj = "wall st j"
nyt = "ny times"
bg = "boston globe"
wp = "washington post"
lat = "la times"
rd30d_yn = "read last 30 dats y/n"
rd1yr_yn = "read last 1 year y/n"
;
Cards4 ;
10 1 1 1 . . . 1
11 1 2 . 1 1 . .
12 2 1 1 . . . .
13 2 2 . . . . .
;;;;
Data temp2 ;
Set temp1 ;
Label
group = "readership group"
var_no = "variable number"
score = "y/n score"
;
/* Assign subjects to readership group. This seems to give you what
you want. */
Select ;
When ( ( rd30d_yn eq 1 ) and ( rd1yr_yn eq 1 ) ) group = 1 ;
When ( ( rd30d_yn eq 1 ) and ( rd1yr_yn eq 2 ) ) group = 2 ;
When ( ( rd30d_yn eq 2 ) and ( rd1yr_yn eq 1 ) ) group = 3 ;
When ( ( rd30d_yn eq 2 ) and ( rd1yr_yn eq 2 ) ) group = 4 ;
Otherwise put ( rd30d_yn rd1yr_yn group )(=) ;
End ;
/* Identifier variables by number. */
If ( rd30d_yn eq 1 ) then do var_no=1 to 6 ; Output ; End ;
If ( rd1yr_yn eq 1 ) then do var_no=7 to 12 ; Output ; End ;
Select ;
When ( ( rd30d_yn eq 1 ) and ( rd1yr_yn eq 2 ) ) do ;
var_no = 1 ; Output ;
var_no = 7 ; Output ;
End ;
When ( ( rd30d_yn eq 2 ) and ( rd1yr_yn eq 1 ) ) do ;
var_no = 1 ; Output ;
var_no = 7 ; Output ;
End ;
When ( ( rd30d_yn eq 2 ) and ( rd1yr_yn eq 2 ) ) do ;
var_no = 1 ; Output ;
var_no = 7 ; Output ;
End ;
Otherwise put ( rd30d_yn rd1yr_yn var_no )(=) ;
End ;
Run ;
Proc print ;
Run ;
/*********************************************************************/
-----Original Message-----
From: SAS(r) Discussion [mailto:SAS-L@LISTSERV.UGA.EDU] On Behalf Of
sallys999@HOTMAIL.COM
Sent: Monday, February 21, 2005 3:38 PM
To: SAS-L@LISTSERV.UGA.EDU
Subject: Data step - do loop, if-then-else, output
Hello:
I've been asked to do a newspaper readership survey and I would welcome
some help with the coding. I've put an example below of the data, my
code, the desired output, and my output :(
wsj = wall st j
nyt = ny times
bg = boston globe
wp = washington post
lat = la times
1 = yes
2 = no
rd30d_yn = read last 30 dats y/n
rd1yr_yn = read last 1 year y/n
id = reader id
Any help would be appreciated, especially simplifying the code.
Hopefully it's something simple that I'm missing.
Thanks,
Sally
data temp1 ;
infile cards ;
input id rd30d_yn rd1yr_yn wsj nyt bg wp lat ;
* 1=Yes, 2=No ;
cards ;
10 1 1 1 . . . 1
11 1 2 . 1 1 . .
12 2 1 1 . . . .
13 2 2 . . . . .
;
run ;
data temp2 ;
set temp1 ;
group = (.) ; * readership group ;
var_no = (.) ; * variable number ;
score = (.) ; * y/n score ;
*-------------------------------------*
| Assign subjects to readership group |
*-------------------------------------;
if (rd30d_yn=1 and rd1yr_yn=1) then do ;
group=1 ;
end ;
else if (rd30d_yn=1 and rd1yr_yn=2) then do ;
group=2 ;
end ;
else if (rd30d_yn=2 and rd1yr_yn=1) then do ;
group=3 ;
end ;
else if (rd30d_yn=2 and rd1yr_yn=2) then do ;
group=4 ;
end ;
*--------------------------------------*
| Identifier variables by number |
*--------------------------------------;
if rd30d_yn=1 then do ;
var_no=1 ; output ;
do var_no = 2 to 6 ;
output ;
end ;
end ;
if rd1yr_yn=1 then do ;
var_no=7 ; output ;
do var_no=8 to 12 ;
output ;
end ;
end;
if rd30d_yn=1 and rd1yr_yn=2 then do ;
var_no=1 ; output ;
var_no=7 ; output ;
end ;
if rd30d_yn=2 and rd1yr_yn=1 then do ;
var_no=1 ; output ;
var_no=7 ; output ;
end ;
if rd30d_yn=2 and rd1yr_yn=2 then do ;
var_no=1 ; output ;
var_no=7 ; output ;
end ;
run ;
Input:
id rd30d_yn rd1yr_yn wsj nyt bg wp lat
10 1 1 1 . . . 1
11 1 2 . 1 1 . .
12 2 1 1 . . . .
13 2 2 . . . . .
Output (Required):
id rd30d_yn rd1yr_yn wsj nyt bg wp lat group var_no score
10 1 1 1 . . . 1 1 1 1
10 1 1 1 . . . 1 1 2 1
10 1 1 1 . . . 1 1 3 .
10 1 1 1 . . . 1 1 4 .
10 1 1 1 . . . 1 1 5 .
10 1 1 1 . . . 1 1 6 1
10 1 1 1 . . . 1 1 7 1
10 1 1 1 . . . 1 1 8 1
10 1 1 1 . . . 1 1 9 .
10 1 1 1 . . . 1 1 10 .
10 1 1 1 . . . 1 1 11 .
10 1 1 1 . . . 1 1 12 1
11 1 2 . 1 1 . . 2 1 1
11 1 2 . 1 1 . . 2 2 .
11 1 2 . 1 1 . . 2 3 1
11 1 2 . 1 1 . . 2 4 1
11 1 2 . 1 1 . . 2 5 .
11 1 2 . 1 1 . . 2 6 .
11 1 2 . 1 1 . . 2 7 2
12 2 1 1 . . . . 3 1 2
12 2 1 1 . . . . 3 7 1
12 2 1 1 . . . . 3 8 1
12 2 1 1 . . . . 3 9 .
12 2 1 1 . . . . 3 10 .
12 2 1 1 . . . . 3 11 .
12 2 1 1 . . . . 3 12 .
13 2 2 . . . . . 4 1 2
13 2 2 . . . . . 4 7 2
Output (as programed):
id rd30d_yn rd1yr_yn wsj nyt bg wp lat group var_no score
10 1 1 1 . . . 1 1 1 .
10 1 1 1 . . . 1 1 2 .
10 1 1 1 . . . 1 1 3 .
10 1 1 1 . . . 1 1 4 .
10 1 1 1 . . . 1 1 5 .
10 1 1 1 . . . 1 1 6 .
10 1 1 1 . . . 1 1 7 .
10 1 1 1 . . . 1 1 8 .
10 1 1 1 . . . 1 1 9 .
10 1 1 1 . . . 1 1 10 .
10 1 1 1 . . . 1 1 11 .
10 1 1 1 . . . 1 1 12 .
11 1 2 . 1 1 . . 2 1 .
11 1 2 . 1 1 . . 2 2 .
11 1 2 . 1 1 . . 2 3 .
11 1 2 . 1 1 . . 2 4 .
11 1 2 . 1 1 . . 2 5 .
11 1 2 . 1 1 . . 2 6 .
11 1 2 . 1 1 . . 2 1 .
11 1 2 . 1 1 . . 2 7 .
12 2 1 1 . . . . 3 7 .
12 2 1 1 . . . . 3 8 .
12 2 1 1 . . . . 3 9 .
12 2 1 1 . . . . 3 10 .
12 2 1 1 . . . . 3 11 .
12 2 1 1 . . . . 3 12 .
12 2 1 1 . . . . 3 1 .
12 2 1 1 . . . . 3 7 .
13 2 2 . . . . . 4 1 .
13 2 2 . . . . . 4 7 .
|