Sas 基于辅助数据集中的值和匹配条件在主数据集中输入缺少的值

Sas 基于辅助数据集中的值和匹配条件在主数据集中输入缺少的值,sas,sas-iml,Sas,Sas Iml,我对SAS的理解非常初级。我正在尝试做类似的事情,我需要帮助 我有一个包含20000个观测值的主数据集a,其中Col1存储城市,Col2存储英里数。Col2包含大量缺失的数据。如下图所示 +----------------+---------------+ | Col1 | Col2 | +----------------+---------------+ | Gary,IN | 242.34 | +---------------

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

我有一个包含20000个观测值的主数据集a,其中Col1存储城市,Col2存储英里数。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存储城市,Col2存储英里数。但是,在此数据集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中执行此操作需要帮助,您只需合并两个数据集即可。请注意,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中的值。

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

有时在SAS中,
PROC SQL
允许您跳过与
数据
步骤相比的一些段落(存储资源和计算时间相对增加),而
合并
就是一个典型的例子

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


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

您不应该删除col2\u new吗?我同意。这很好。请注意,如果您希望保留A中的所有内容并仅添加B中的col2,则可以执行
选择A.*,
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;