我对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中的丢失里程。
在这个例子中,我试图从数据集B填写数据集A中的321.45,并且通过匹配两个数据集之间的Col1(城市名称)来类似地填写176.34。
我需要在SAS中帮助这样做
答案 0 :(得分: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中的值。
答案 1 :(得分:1)
Pekka的解决方案完美无缺,我为了完整性而添加了替代解决方案。
有时在SAS中,与PROC SQL
步骤相比,DATA
允许您跳过某些段落(存储资源和计算时间相对增加),MERGE
是典型示例
在这里,您可以避免对输入数据集进行排序并处理变量的重命名(此处匹配的键具有相同的名称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()
函数返回参数列表中遇到的第一个非缺失元素。