在我的理解中合并 2 个数据集是一对多合并 SAS
Merging 2 data seta in what I understand is one-to many merge SAS
我有2个数据集:
|ColA|ColB
|date1|1
|date2|2
|date3|3
|cola|colb|colc.....|colz|
|blaa|blaa|blaaaaaaa|date1
|blab|blab|blaaaaaab|date1
|blac|blac|blaaaaaac|date1
|blaa|blaa|blaaaaaaa|date2
|blag|blag|blaaaaaag|date3
我想要的是每个日期的数字都等于第一个 table
|cola|colb|colc.....|colz |ColZ+1
|blaa|blaa|blaaaaaaa|date1|1
|blab|blab|blaaaaaab|date1|1
|blac|blac|blaaaaaac|date1|1
|blaa|blaa|blaaaaaaa|date2|2
|blag|blag|blaaaaaag|date3|3
我尝试过的:
proc sql;
create table merged_dpd_raw_2602_B
as select a.*, b.delnum
from merged_dpd_raw_2602 a
left join work.date_transform b
on datepart(a.reporting_date) = datepart(b.DATE)
;quit;
它只是在上个月加了一个数字。所有其他月份都有一个“。” .
proc sort data=date_transform;
by formatted_date;
run;
proc sort data=merged_dpd_raw_2602;
by formatted_date;
run;
data merged_dpd_raw_2602_B;
merge date_transform(in=A) merged_dpd_raw_2602(in=B);
by formatted_date;
if A=1 and B=1;
run;
正确合并,但我不知何故丢失了 310k 数据条目。
我怀疑您不是在尝试合并实际日期而是一个月,因此您很可能使用的是格式化值。因此,将您的日期设置为月初或将它们转换为 YYMM 以合并。
proc sql;
create table merged_dpd_raw_2602_B
as select a.*, b.delnum
from merged_dpd_raw_2602 a
left join work.date_transform b
on intnx('month', datepart(a.reporting_date), 0, 'b') = intnx('month', datepart(b.DATE), 0, 'b')
;quit;
所以我调试的方式如下。
首先使用数据步合并 - 它能够很好地处理多对一。
data merged_dpd_raw_2602_B nomatch;
merge date_transform(in=__date) merged_dpd_raw_2602(in=__raw);
by formatted_date;
if __date and __raw then output merged_dbd_raw_2602_b;
else do;
invar = ifn(__date,'in date','in raw ');
output nomatch;
end;
run;
这会向您显示不匹配的记录。重要的是,数据步骤合并的工作方式,它可能会以正确的顺序向您显示记录(但也可能不是,这取决于合并不起作用的原因)。
您可能不太关心“in date”记录,它可能只是您关心的“in raw”变量——假设我知道哪一个是记录最多的那个。查看不匹配的记录,然后尝试找出它们应该匹配的内容(记录可能从“in date”开始就在那里,但如果“in date”记录匹配不同的“原始”记录)。
这可以让您准确了解数据中的错误。
我有2个数据集:
|ColA|ColB
|date1|1
|date2|2
|date3|3
|cola|colb|colc.....|colz|
|blaa|blaa|blaaaaaaa|date1
|blab|blab|blaaaaaab|date1
|blac|blac|blaaaaaac|date1
|blaa|blaa|blaaaaaaa|date2
|blag|blag|blaaaaaag|date3
我想要的是每个日期的数字都等于第一个 table
|cola|colb|colc.....|colz |ColZ+1
|blaa|blaa|blaaaaaaa|date1|1
|blab|blab|blaaaaaab|date1|1
|blac|blac|blaaaaaac|date1|1
|blaa|blaa|blaaaaaaa|date2|2
|blag|blag|blaaaaaag|date3|3
我尝试过的:
proc sql;
create table merged_dpd_raw_2602_B
as select a.*, b.delnum
from merged_dpd_raw_2602 a
left join work.date_transform b
on datepart(a.reporting_date) = datepart(b.DATE)
;quit;
它只是在上个月加了一个数字。所有其他月份都有一个“。” .
proc sort data=date_transform;
by formatted_date;
run;
proc sort data=merged_dpd_raw_2602;
by formatted_date;
run;
data merged_dpd_raw_2602_B;
merge date_transform(in=A) merged_dpd_raw_2602(in=B);
by formatted_date;
if A=1 and B=1;
run;
正确合并,但我不知何故丢失了 310k 数据条目。
我怀疑您不是在尝试合并实际日期而是一个月,因此您很可能使用的是格式化值。因此,将您的日期设置为月初或将它们转换为 YYMM 以合并。
proc sql;
create table merged_dpd_raw_2602_B
as select a.*, b.delnum
from merged_dpd_raw_2602 a
left join work.date_transform b
on intnx('month', datepart(a.reporting_date), 0, 'b') = intnx('month', datepart(b.DATE), 0, 'b')
;quit;
所以我调试的方式如下。
首先使用数据步合并 - 它能够很好地处理多对一。
data merged_dpd_raw_2602_B nomatch;
merge date_transform(in=__date) merged_dpd_raw_2602(in=__raw);
by formatted_date;
if __date and __raw then output merged_dbd_raw_2602_b;
else do;
invar = ifn(__date,'in date','in raw ');
output nomatch;
end;
run;
这会向您显示不匹配的记录。重要的是,数据步骤合并的工作方式,它可能会以正确的顺序向您显示记录(但也可能不是,这取决于合并不起作用的原因)。
您可能不太关心“in date”记录,它可能只是您关心的“in raw”变量——假设我知道哪一个是记录最多的那个。查看不匹配的记录,然后尝试找出它们应该匹配的内容(记录可能从“in date”开始就在那里,但如果“in date”记录匹配不同的“原始”记录)。
这可以让您准确了解数据中的错误。