1

在这里学习SAS...

我有一个数据集,名称salesPeople如下:

personID      personZip
123           47382
123           47382
123           47382
123           47382
123           47382
123           47382
123           47382
123           47382
123           76737
123           76737
123           76737
123           Smallville
123           Smallville
123           Smallville
654           27767
654           27767
654           27767
654           27767
654           27767
654           27767
654           27767
654           83764
654           83764
654           83764
654           83764
654           Metropolis
654           Metropolis
654           Metropolis
654           Metropolis
...           ...

对于每个personID,可能有多达数百个观察值。其中绝大多数将使用相同的邮政编码。可能还有 1-3 个其他有效的邮政编码。并且,对于每个人,有几个观察值将具有城市名称(例如,超人前传)而不是城市邮政编码(在本例中为 47382,在超人前传中)。在这个数据集中,当在personZip列中找到城市名称时,总是对应于最常正确输入的 personZip。

就我所做的而言,可以安全地假设将城市名称的所有实例替换为最常见的personZip. 例如,在这里,Smallville47382Metropolis替换是完全可以接受的27767。事实上,这正是我想做的。数据集中有数千个唯一personIDsalesPeople,以及数十万个观测值。

我想要做的是确定最常见personZip的每个personID,然后用该 zip 替换无效的城市名称。确定最频繁personZip值并将其存储以便我可以将其与salesPeople数据集合并回的最佳方法是什么?

4

1 回答 1

1

手动方式,通过proc summary. 使用 SQL 可能有一种更短的方法来执行此操作。

proc summary data=salespeople nway;
    class personid personzip;
    output out=tmp (drop=_type_);
run;

proc sort data=tmp;
   by personid descending _freq_;
run;

data tmp;
    set tmp;
    by personid;
    if first.personid;
    /* default zip code is most common code */
    rename personzip = defaultzip;
run;

proc sort data=salespeople;
    by personid;
run;

data salespeople;
    merge salespeople (in=a) tmp (in=b);
    by personid;
    /* replace all non-numeric zips with default value */
    /* assumes non-numerics are rare */
    if personzip * 1 = '' then personzip = defaultzip;
run;
于 2013-07-16T01:16:15.997 回答