0

我对SAS的理解非常初级。我正在尝试做这样的事情,我需要帮助。

我有一个包含 20,000 个观察值的主数据集 A,其中 Col1 存储 CITY,Col2 存储 MILES。Col2 包含大量缺失数据。如下图所示。

+----------------+---------------+
|       Col1     |    Col2       |
+----------------+---------------+
|  Gary,IN       |       242.34  |
+----------------+---------------+
| Lafayette,OH   |       .       |
+----------------+---------------+
|   Ames, IA     |       123.19  |
+----------------+---------------+
|  San Jose,CA   |       212.55  |
+----------------+---------------+
| Schuaumburg,IL |       .       |
+----------------+---------------+
| Santa Cruz,CA  |       454.44  |
+----------------+---------------+

我有另一个辅助数据集 B,它有大约 5000 个观察值,与数据集 A 非常相似,其中 Col1 存储 CITY,Col2 存储 MILES。然而,在这个数据集 B 中,Col2 不包含缺失数据。

+----------------+---------------+
|       Col1     |    Col2       |
+----------------+---------------+
| Lafayette,OH   |       321.45  |
+----------------+---------------+
|  San Jose,CA   |       212.55  |
+----------------+---------------+
| Schuaumburg,IL |       176.34  |
+----------------+---------------+
| Santa Cruz,CA  |       454.44  |
+----------------+---------------+

我的目标是通过匹配 col1 中的城市名称,根据数据集 B 中的英里数来填充数据集 A 中缺失的英里数。

在此示例中,我试图通过匹配两个数据集之间的 Col1(城市名称)来从数据集 B 中填充数据集 A 中的 321.45 和类似的 176.34。

我在 SAS 中需要帮助

4

2 回答 2

1

Pekka 的解决方案非常有效,为了完整起见,我添加了一个替代解决方案。

有时在 SAS中,与一步PROC SQL相比,a 可以让你跳过一些段落DATA(存储资源和计算时间的相对增益),aMERGE是一个典型的例子。

在这里,您可以避免对输入数据集进行排序和处理变量的重命名(这里匹配的键具有相同的名称col1,但通常情况并非如此)。

proc sql;
    create table want as
    select A.col1,
            coalesce(A.col2,B.col2) as col2
        from A left join B
            on A.col1=B.col1
        order by A.col1;
quit;

coalesce()函数返回参数列表中遇到的第一个非缺失元素。

于 2014-08-18T08:34:54.420 回答
1

您只需合并两个数据集。请注意,Col1 的值需要在两个数据集中完全匹配。

另外,我假设 Col1 在数据集 B 中是唯一的。否则,您需要以某种方式更准确地告诉您要使用什么值或删除重复项(例如,通过在 proc sort 语句中添加 nodupkey)。

以下是如何在 SAS 中合并的示例:

proc sort data=A;
    by Col1;

proc sort data=B;
    by Col1;

data AB;
    merge A(in=a) B(keep=Col1 Col2 rename=(Col2 = Col2_new));
    by Col1;
    if a;
    if missing(Col2) then Col2 = Col2_new;
    drop Col2_new;
run;

这包括数据集 A 中的所有观察值和列。如果 A 中缺少 Col2,则我们使用 B 中的值。

于 2014-08-16T19:07:48.307 回答