2013-09-05 74 views
1

我想轉置一個表從長到寬,但我有多個值爲每個密鑰。我希望轉置表對每個Id和Key的組合都有一行,所以對於這個示例項目,我將在轉換後有8行。 Id變量將被保留,每個不同的Key將是同一個鍵的所有不同值的組合。所以2 * 2 * 1 * 1 * 1 * 2 = 8行。轉置保留所有組合的多個值爲變量的變量在SAS

data grades; 
input Id Key $ Value $; 
cards; 
219381 Category Something 
219381 Category Another 
219381 Color White 
219381 Color Black 
219381 Sport Football 
219381 Gender Male 
219381 Size  Big 
219381 Quality Good 
219381 Quality Bad 
; 
run; 

這是我想這個複雜的換位之後出來什麼:

Id  Category Color Sport Gender Size Quality 
219381 Something White Football Male Big Good 
219381 Something White Football Male Big Bad 
219381 Something Black Football Male Big Good 
219381 Something Black Football Male Big Bad 
219381 Another White Football Male Big Good 
219381 Another White Football Male Big Bad 
219381 Another Black Football Male Big Good 
219381 Another Black Football Male Big Bad 

任何想法如何,我可以做到這一點? 我已經嘗試了許多事情,但都沒有成功。

+0

我認爲SASsy解決這個問題的方法是HOH(Hash of Hashes)。我現在沒有時間寫一篇文章,因爲這篇文章經常不足以記住我的頭頂。但是,http://support.sas.com/resources/papers/proceedings11/255-2011.pdf將是一個好的開始,如果我有一些時間,我會回來寫下來。 – Joe

+0

@Joe,如果您可以將您的SASsy解決方案與HoHs一起發佈,我認爲這將非常具有啓發性(不僅適用於我)。 –

回答

2

對我來說,這看起來像你想要一個笛卡爾產品存儲在一個表中的不同鍵。儘管不像SAS那樣,但您可以通過使用PROC SQL與同一個表上的聯接來獲得您要查找的結果的一種方法,即模擬這些不同鍵類型的單個表。

PROC SQL; 
    CREATE TABLE grades_combos AS 
    SELECT DISTINCT 
     g.id, category.value as category, color.value as color, sport.value as sport, 
     gender.value as gender, size.value as size, quality.value as quality 
    FROM grades g 
    INNER JOIN grades category ON category.id = g.id AND category.key = 'Category' 
    INNER JOIN grades color ON color.id = g.id AND color.key = 'Color' 
    INNER JOIN grades sport ON sport.id = g.id AND sport.key = 'Sport' 
    INNER JOIN grades gender ON gender.id = g.id AND gender.key = 'Gender' 
    INNER JOIN grades size ON size.id = g.id AND size.key = 'Size' 
    INNER JOIN grades quality ON quality.id = g.id AND quality.key = 'Quality' 

    ORDER BY id, category, color, sport, gender, size, quality 
    ; 
QUIT; 

你也許可以讓這個更靈活和通用,也許在其基於密鑰的任意一套JOIN語句宏包裝這一點。

+0

同意這種非流行的,但它絕對是一個很好的解決方案(雖然,即使中等規模的數據也非常慢)。 – Joe

+0

這工作,我只是改變了我的真正問題左連接的內部連接,因爲並不是所有的鍵都存在於每個ID。 –

0

從我的頭頂,我認爲以下兩種方法之一:

  1. 使用的語句? (需要排序數據)
  2. 創建第三個變量,它與其他變量串聯並使用該變量。