BookmarkSubscribeRSS Feed
jklein271
Calcite | Level 5
I've searched online quite a bit and haven't found a solution to this. Is there any way to suppress the following Note/Error when an invalid zipcode is passed to the zipstate function?

NOTE: Invalid argument to function ZIPSTATE at line 109 column 85.
ERROR: Limit set by ERRORS= option reached. Further errors of this type will
not be printed.

I realize it is a valid error, but I'd rather just have the result of the zipstate function return a null with no note/error in the log if the zipcode being passed to it is invalid.

Thanks.
5 REPLIES 5
Doc_Duke
Rhodochrosite | Level 12
You could always query the data table directly, SASHELP.ZIPCODE, to get the state.

Note that the data is generally a year or two out of date. I just installed SAS 9.2 TS2M2 and the data are still from April 2008. See

http://support.sas.com/documentation/cdl/en/lrdict/62618/HTML/default/a000212667.htm#a003069100
jklein271
Calcite | Level 5
Thanks, Doc. That's sort of the approach I'm going with.

Can anyone confirm that the zipstate function feeds off of SASHELP.ZIPCODE directly? I try to update the ZIPCODE table in HELP from SAS's website (http://support.sas.com/rnd/datavisualization/mapsonline/html/misc.html) as soon as they become available. However, I'm seeing some major discrepancies when comparing the results of ZIPSTATE versus SASHELP.ZIPCODE. The online doc states the following:

"The SASHELP.ZIPCODE data set contains postal code information that is used with the ZIPSTATE and other ZIP code functions. This data set is updated with each new release of SAS software."

Is this true for manual updates after a software release as well? I'm seeing 7 state differences between the two sources. Also, if you loop from 0 to 99999 and feed it to zipstate, it assigns a state to 95,760 zipcodes whereas my current sashelp.zipcodes has 42,085.
jklein271
Calcite | Level 5
Thinking about it some more ZIPSTATE returning more zipcodes with states than SASHELP.ZIPCODE is making sense. I would imagine the latter is only active zips at that size. ZIPSTATE would return a state for any zipcode that's ever been active. Let's say this theory is accurate and explains the difference in zipcode count.

It still doesn't explain differences in state assignment to a zipcode if zipstate is feeding off of sashelp.

/*zipcode sashelp_state zipstate_state*/
/*20588 MD DC*/
/*20598 VA DC*/
/*83414 WY ID*/
/*96595 CA */
/*96598 CA */
/*96599 CA */
/*96939 PW GU*/
Doc_Duke
Rhodochrosite | Level 12
The reason that ZIPSTATE returns more codes than are in the table is in the documentation that I referenced:

"To determine which state corresponds to a particular ZIP code, this function uses a zone table that consists of the start and end ZIP code values for each state. It then finds the corresponding state for that range of ZIP codes. The zone table consists of start and end ZIP code values for each state to allow for exceptions, and does not validate ZIP code values."

It also documents why you find differences in location over time.

"With very few exceptions, a zone does not span multiple states. The exceptions are included in the zone table. It is possible for new zones or new exceptions to be added by the U.S. Postal Service at any time. "
jklein271
Calcite | Level 5
Thanks again. For anyone that's interested, this is what I ended up doing. There are no errors in the log for invalid arguments and it actually runs a little faster than the function straight up. Below is the code I used as a base and then my code.

http://www.sascommunity.org/wiki/Fixed_Zipstate_function

* Zipcode to State using ZIPSTATE() = zipstate;
data fmts(drop=i);
length start $ 5 end $ 5 fmtname $ 8 label $ 2 type $ 1;
retain fmtname "zipstate" hlo " " type "C";
do i=0 to 99999;
start=PUT(i,z5.);
end=start;
label=zipstate(start);
if label > '' then output;
end;
start=' '; hlo = 'O'; label=' '; output;
run;
proc format library = VAULT cntlin=fmts; run;
proc datasets library=work nolist; delete fmts; quit;

sas-innovate-2024.png

Join us for SAS Innovate April 16-19 at the Aria in Las Vegas. Bring the team and save big with our group pricing for a limited time only.

Pre-conference courses and tutorials are filling up fast and are always a sellout. Register today to reserve your seat.

 

Register now!

How to Concatenate Values

Learn how use the CAT functions in SAS to join values from multiple variables into a single value.

Find more tutorials on the SAS Users YouTube channel.

Click image to register for webinarClick image to register for webinar

Classroom Training Available!

Select SAS Training centers are offering in-person courses. View upcoming courses for:

View all other training opportunities.

Discussion stats
  • 5 replies
  • 1543 views
  • 0 likes
  • 2 in conversation