2013-04-10 61 views
2
做雙換位

可以請你幫我把這個我的數據:如何在SAS

Name + Class + Teacher 
-------+---------+----------- 
Fred + Chem + Mr Blond 
Fred + Chem + Mr Pink 
Fred + Maths + Mr Blond 
Barney + Chem + Mr Brown 
Barney + French + Mr Black 
Barney + French + Mr Blond 

這樣:

Name + Class1 + Teacher1_1 + Teacher1_2 + Class2 + Teacher2_1 + Teacher2_2 
-------+---------+------------+------------+---------+------------+------------ 
Fred + Chem + Mr Blond + Mr Pink + Maths + Mr Blond + 
Barney + Chem + Mr Brown +   + French + Mr Black + Mr Blond 

每個學生,所以基本上是一個觀察中,調換班級每名學生和老師按照學生班級轉換,但與班級交錯。

我不知道這是否是一個雙PROC置操作或別的東西。我遇到過使用PROC SUMMARY的東西,但我對此不太瞭解。這可能是一個手動DATA步驟的事情,但我真的很茫然。

謝謝。

+0

我應該補充一點,我並不太在意上面列出的命名約定。 Name |也許會更好Class1 | Class1_Teacher1 | Class1_Teacher2 | Class2 | Class2_Teacher1 | Class2_Teacher2。這是我需要幫助的結構。 – seestevecode 2013-04-10 12:32:55

回答

1

容易餡餅。首先輸出到垂直格式,然後轉置。這個唯一棘手的部分相比於普通雙層變調是你的類/教師組合不是唯一的,所以你必須在一些額外的邏輯添加 - 通常是一個陣列將工作更好,但不是在這種情況下。

data have; 
input Name $ Class $ Teacher $; 
datalines; 
Fred Chem  MrBlond 
Fred Chem  MrPink 
Fred Maths MrBlond 
Barney Chem  MrBrown 
Barney French MrBlack 
Barney French MrBlond 
;;;; 
run; 

data have_pret; 
set have; 
array transvars[2] class teacher; 
by name class notsorted; 
if first.name then counter=0; 
if first.class then do; 
    class_counter=0; 
    counter+1; 
    id=cats('Class',counter); 
    value=class; 
    output; 
end; 
class_counter+1; 
id=cats('Teacher',counter,'_',class_counter); 
value=teacher; 
output; 
run; 

proc transpose data=have_pret out=want; 
by name notsorted; 
id id; 
var value; 
run; 
+0

非常感謝。這是做的伎倆。我對id行做了一些小修改,以創建我在上面添加的評論中提到的格式,現在它已經很完美了。我對SAS陣列並不瞭解太多,所以這絕不會是我曾經看過的。總是要學習。再次感謝。 – seestevecode 2013-04-11 07:14:30

+0

我實際上並沒有在那裏使用數組;我原來是這樣做的,然後決定不去,只是忘記刪除數組語句:)數組適用於簡單的情況,但不適用於您不需要一對一換位的情況。 – Joe 2013-04-11 15:27:23

+0

再次感謝您對@Joe的幫助。你會介意與我分享如何使用一個數組來完成這個工作,即對於更簡單的情況?我試過了,但實際上無法與數組一起使用。 – seestevecode 2013-08-28 09:10:44

1

我相信別人能拿出一個更優雅的解決方案,但這應該工作....

proc sort 
     data=dataset; 
     by name; 
    run; 

    proc transpose 
     data=dataset 
     out=dataset; 
     var Class Teacher; 
     by Name; 
    run; 

    DATA teacher_dataset class_dataset; 
     set dataset; 
     if _NAME_ = "Teacher" then output teacher_dataset; 
     else if _NAME_ = "Class" then output class_dataset; 

    run; 


    PROC SQL; 
     create table final_dataset as 
     select 
       a.Name, 
       b.Col1 as Class1, 
       a.Col1 as Teacher1, 
       b.Col2 as Class2, 
       a.Col2 as Teacher2, 
       b.Col3 as Class3, 
       a.Col3 as Teacher3 

     from  teacher_dataset as a 
     left join class_dataset as b 
      on a.Name=b.Name; 
    quit; 
+0

其實重讀這個問題我回應的並不完全是你想要做的,但我認爲這讓你非常接近... – 2013-04-10 14:52:15

+0

感謝您的回答。正如你所說的那樣,它並沒有讓我感到滿意,但它爲我提供了一些對未來有用的技術。 – seestevecode 2013-04-11 07:12:59