我正在嘗試基于變數 office_id 和 office_id_flag 連接兩個資料集,每個資料集都有 50,000 個觀察值。
資料1變數
- 格魯普
- 年齡
- 西班牙裔
- ID
- 種族
- 性別
- 精神疾病
- mental_ill_dx
- office_id
- office_id_flag
資料2變數
- er_vis
- adm_hr
- 心理醫院
- 心理可見性
- 地區
- region_rpc
- 收費
- office_id
- office_id_flag
我首先在資料步驟合并程序中嘗試了這個,因為我知道它是如何作業的,結果資料集有 50,000 個觀察值和 17 個變數,這對我來說很有意義。合并代碼:
proc sort data=data1; by office_id; run;
proc sort data=data2; by office_id; run;
data work.merge_datastep;
merge data1 (in=dem) data2 (in=hosp);
by office_id;
if dem and hosp;
run;
*53000 observations and 17 variables;
我嘗試了很多 SQL 合并型別,每種型別都生成了一個包含 56000 個觀察值和 17 個變數的資料集,這是沒有意義的。
這是我在 SQL 中嘗試過的:
proc sql;
create table sql_outerjoin as
select *
from data1 full outer join data2 on data1.office_id=data2.office_id;
quit;
proc sql;
create table sql_leftjoin as
select * from data1 left outer join data2 on data1.office_id=data2.office_id;
quit;
proc sql;
create table work.sql_innerjoin as
select data1.*, data2.*
from work.data1, work.data2
where data1.office_id=data2.office_id;
quit;
proc sql ;
create table sql_try1 as
select one.*, two.*
from data1 as one
left join data2 as two
on (one.office_id = two.office_id and one.office_id_flag= two.office_id_flag);
quit;
proc sql;
create table sql_try3 as
select coalesce(a.office_id, b.office_id) as ID
from data1 a
full join data2 b
on a.ID = b.ID;
quit;
proc sql;
create table sparcs_1 as
select *
from data1, data2
where data1.office_id=data2.office_id;
quit;
proc sql;
create table work.sql_leftjoin2 as
select s.*, d.*
from work.data1 as s left join work.data2 as d
on s.office_id=d.office_id;
quit;
此外,這些 proc sql 嘗試中的每一個都導致了這些錯誤:
- 警告:變數 office_id 已存在于檔案 WORK 中。what_table_name。
- WARNING: Variable office_id_flag already exists on file WORK.whatever_table_name.
I'd like the final result to be identical to the datastep merge procedure and have all variables and 50,000 observations, matched on office_id and office_id_flag.
I'm out of my depth and am obviously shooting in the dark with this. Does anyone have any suggestions?
uj5u.com熱心網友回復:
如果資料步驟合并時觀察的數量沒有增加,而是在 SQL 連接中增加,那么您的資料在合并/連接鍵上不是唯一的。當有重復行時,SAS 不會增加合并中的行數 - 它也可能不會做你想要的,但它可能會做一些可以容忍的事情。但是,SQL 將為每個組合生成(取決于您的操作方式)額外的行。
如何解決這個問題?確保您有一個唯一的連接鍵,其中沒有一對(或更多)行在兩個資料集中共享相同的值。或者,考慮為您擁有的資料選擇正確的聯接型別 - 這可能需要匯總資料。
如果資料實際上是唯一的,則可能只是您沒有包含所需的確切組合。
proc sql;
create table sparcs_1 as
select *
from data1, data2
where data1.office_id=data2.office_id
and data1.office_id_flag=data2.office_id_flag
;
quit;
或者
proc sql;
create table sparcs_1 as
select *
from data1 inner join data2
on data1.office_id=data2.office_id
and data1.office_id_flag=data2.office_id_flag
;
quit;
這些都需要行匹配兩個變數并且來自兩個表。但這不是您的 SAS 資料步驟合并所做的 - 它僅取決于office_id,因此它可能會給出不同的結果。很可能你不能在 SQL 中完美地復制這個連接——不添加某種行編號——因為 SAS 進行合并的方式不同,通常不是你真正想要在 SQL 中做的事情。
其次,您的警告是因為您正在做這樣的事情:
select a.*, b.*
如果相同的變數在兩個資料集中,那么您需要兩次。因此警告。如果連接鍵是唯一重疊的變數,那實際上不是問題——那么結果就是你想要的,只是有警告——但是你可以通過從至少一個表中顯式列出你想要的變數來洗掉它。最佳做法是根本不使用*,但這是可以理解的,尤其是當一張表有很多變數時。
uj5u.com熱心網友回復:
謝謝,喬!你的評論很有幫助。
我最終根據觀察行添加了一個行號(來自之前提出的這個問題https://communities.sas.com/t5/SAS-Procedures/PROC-SQL-QUESTION-How-to-add-a-row-number -to-a-table-observation/td-p/167770),并在 SAS 和 proc sql 中測驗生成的資料集。
代碼在這里:
proc sql;
create table rows1 as
select monotonic() as row, *
from work.data1;
quit;
proc sql;
create table rows2 as
select monotonic() as row, *
from work.data2;
quit;
proc sql ;
create table sql_rowmerge1 as
select rows1.*, row2.er_vis, row2.adm_hr, row2.psych_hosp, row2.psych_vis, row2.region, row2.region_rpc, row2.charges
from rows1
left join rows2
on (rows1.row = rows2.row and rows1.office_id = rows2.office_id and rows1.office_id_flag= rows2.office_id_flag);
quit;
正如您所建議的,基于 3 個條件變數的合并,而不僅僅是 2 個(可能不是唯一的)變數,是以適當的方式將兩個資料集拉在一起的原因。結果資料集現在具有正確的 50,000 個觀察值。
再次感謝 - 這太棒了!我學到了一個新方法!
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/359190.html
上一篇:如何在Apache2上將ReactApp與LaravelSanctum集成
下一篇:PySparkSQL連接表
