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