2013-09-05 39 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. 创建第三个变量,它与其他变量串联并使用该变量。