SAS:分配缺失值

时间:2013-10-02 19:27:42

标签: merge sas

我有一个奇怪的数据库,如下所示:

Client Order_number Original_number New_number
A      1            .               .
       .            1               2
B      3            .               .
C      4            .               .
       .            3               5
       .            5               6
       .            2               8
       .            4               9

对于客户A说,他被分配了Order_number = 1。然后由于某种原因,我们必须更改Order_number = New_number = 2 我的目标是为Client列中的缺失空白填充上面的矩阵,如下所示:

Client Order_number Original_number New_number
A      1            .               .
A      .            1               2
B      3            .               .
C      4            .               .
B      .            3               5
B      .            5               6
A      .            2               8
C      .            4               9

如果不使用MERGE,我无法想到一种有效的方法。

1 个答案:

答案 0 :(得分:2)

这个程序有效,但是因为我把它扔到一起所以可能会有点重构。它假设整个表格像您的样本一样排序。它使用哈希表,所以如果你正在处理大的东西,这可能会遇到内存限制。

这个想法是在你去的时候建立一些哈希表,这样你就可以得到上面几行中出现的内容。

data want (drop=rc map_:);
    if _n_ = 1 then do;
        declare hash orig_new();
        orig_new.definekey('map_original');
        orig_new.definedata('map_new','map_client');
        orig_new.definedone();

        declare hash new_client();
        new_client.definekey('map_new');
        new_client.definedata('map_client');
        new_client.definedone();
    end;

    set have;

    if order ne . then do;
        map_original = order;
        map_new = .;
        map_client = client;
        rc = orig_new.add();
    end;

    if client = '' then do;
        rc = orig_new.find(key:original);
        client = map_client;
    end;

    if new ne . then do;
        map_original = original;
        map_new = new;
        map_client = client;
        rc = orig_new.add();
        rc = new_client.add();
    end;

    rc = new_client.find(key:original);
    client = map_client;

run;

(我不知道这是否会有所帮助,但至少我很喜欢这个练习。)