如何在SAS DATA步骤中进行频率计数?

时间:2013-07-16 00:07:47

标签: sas

在这里学习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个其他有效的邮政编码。并且,对于每个人,有几个观察将具有城市名称(例如,Smallville)而不是城市zip(47382,在这种情况下,在Smallville)。在此数据集中,城市名称(在personZip列中找到时)始终对应于最常输入的人员名称。

出于我正在做的目的,可以安全地假设用最常见的personZip替换城市名称的所有实例。例如,将Smallville47382Metropolis替换为27767完全可以接受。事实上,这正是我想要做的。 personID数据集中有数千个唯一的salesPeople值,以及数十万个观察值。

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

1 个答案:

答案 0 :(得分: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;