2016-11-23 53 views
0

我需要合併兩個數據集。每個數據集都包含一個順序觀察編號。第一個數據集只包含第一個觀察值。第二個數據集包含所有後續的觀察結果。並非所有的科目都有相同的觀察次數。SAS/SQL:結合兩列同時保留其他列

問題如下。有兩種不同類型的主題。該類型僅包含在第一個數據集中。當我將兩個數據集合在一起時,所有觀測值中都缺少類型,但每個主題的類型都是第一個。請看下面的例子。

我想知道如何使用SQL和DATA步驟來完成此操作。我的真實數據集並不大,因此處理效率並不是一個主要問題。

我嘗試過使用RETAIN,但由於第二個數據集不包含TYPE變量,因此沒有值保留。關於SQL,似乎UNION應該可以工作,並且在互聯網上有無數個UNION的例子,但它們都涉及單個變量。我需要知道如何結合Observation變量ID,同時保留Amount並指定Type


data set1; 
    input ID $ 
     Observation 
     Type $ 
     Amount 
     ; 

    datalines; 
    002 1 A 15 
    026 1 A 30 
    031 1 B 7 
    028 1 B 10 
    036 1 A 22 
    ; 
run; 

data set2; 
    input ID $ 
     Observation 
     Amount 
     ; 

    datalines; 
    002 2 11 
    002 3 35 
    002 4 13 
    002 5 12 
    026 2 21 
    026 3 12 
    026 4 40 
    031 2 11 
    028 2 27 
    036 2 10 
    036 3 15 
    036 4 16 
    036 5 12 
    036 6 20 
    ; 
run; 

proc sort data = set1; 
    by ID 
     Observation 
     ; 
run; 

proc sort data = set2; 
    by ID 
     Observation 
     ; 
run; 

data merged; 
    merge set1 
     set2 
     ; 
    by ID 
     Observation 
     ; 
run; 

這給

     ID  Observation Type Amount 

         002   1   A  15 
         002   2     11 
         002   3     35 
         002   4     13 
         002   5     12 
         026   1   A  30 
         026   2     21 
         026   3     12 
         026   4     40 
         028   1   B  10 
         028   2     27 
         031   1   B   7 
         031   2     11 
         036   1   A  22 
         036   2     10 
         036   3     15 
         036   4     16 
         036   5     12 
         036   6     20 

不過,我需要的是

     ID  Observation Type Amount 

         002   1   A  15 
         002   2   A  11 
         002   3   A  35 
         002   4   A  13 
         002   5   A  12 
         026   1   A  30 
         026   2   A  21 
         026   3   A  12 
         026   4   A  40 
         028   1   B  10 
         028   2   B  27 
         031   1   B   7 
         031   2   B  11 
         036   1   A  22 
         036   2   A  10 
         036   3   A  15 
         036   4   A  16 
         036   5   A  12 
         036   6   A  20 

回答

0

我敢肯定還有其他的方法來做到這一點,但是我是這樣做的。

首先,堆疊數據只保留常見字段。

data new; 
set set1 (drop = TYPE) set2; 
run; 

然後重新合併類型字段。

proc sql; 
create table new2 as select 
a.*, 
b.TYPE 
from new a 
left join set1 b 
on a.id=b.id; 
quit; 
0

PROC SQL:

proc sql; 
    create table want as 
    select coalesce(a.id,b.id) as id,observation,type,amount from (select * from set1(drop=type) union 
    select * from set2) a left join set1 (keep=id type) b 
on a.id=b.id; 
quit; 
+0

感謝您的編輯。我不清楚爲什麼合併是必要的,因爲選擇'a.id'或'b.id'產生相同的結果。這是我第一次遇到聚合,所以我可能錯過了一些東西。 –

+1

通常在使用FULL JOIN時,您需要使用COALESCE(),因爲您不知道哪個參與表將缺少該ID的值。但是在這種情況下,別名B中的所有內容也都是別名A,因此您可以只使用A.ID。 – Tom

0

數據步法是直線前進,只是用SETBY交錯的記錄​​。您需要創建一個NEW變量來保留這些值。如果你想要的話,你可以放棄舊的,重命名新的名稱。

data want ; 
    set set1 set2 ; 
    by id ; 
    if first.id then new_type=type; 
    retain new_type; 
run; 

對於SQL,使用@JJFord3發佈的方法首先將通用字段合併,然後合併到TYPE標誌上。你可以合併成一個單一的聲明。

proc sql; 
    create table want as 
    select a.*,b.type 
    from 
     (select id,observation,amount from set1 
     union 
     select id,observation,amount from set2 
    ) a 
    left join set1 b 
    on a.id = b.id 
    order by 1,2 
    ; 
quit; 
相關問題