1

我有一个类似这样的 sas 数据库:

id birthday Date1    Date2
1  12/4/01  12/4/13  12/3/14
2  12/3/01  12/6/13  12/2/14
3  12/9/01  12/4/03  12/9/14
4  12/8/13  12/3/14  12/10/16

我想要这种形式的数据:

id Date     Datetype
1  12/4/01  birthday  
1  12/4/13  1   
1  12/3/14  2    
2  12/3/01  birthday  
2  12/6/13  1
2  12/2/14  2
3  12/9/01  birthday
3  12/4/03  1
3  12/9/14  2
4  12/8/13  birthday
4  12/3/14  1
4  12/10/16 2

感谢您的帮助,我在第二周使用 sas <3 编辑:感谢我,我没有找到排序方法。

4

2 回答 2

0

再会。以下应该是您所追求的。我没有想出一种简单的方法来重命名列,因为它们不在起始数据中。

   /*Data generation for ease of testing*/
    data begin; 
        input id birthday $ Date1 $ Date2 $; 
        cards;
    1  12/4/01  12/4/13  12/3/14
    2  12/3/01  12/6/13  12/2/14
    3  12/9/01  12/4/03  12/9/14
    4  12/8/13  12/3/14  12/10/16
    ; run; 

   /*The trick here is to use date: The colon means everything beginning with date, comparae with sql 'date%'*/
    proc transpose data= begin out=trans; 
        by id; 
        var birthday date: ; 
    run;

    /*Cleanup. Renaming the columns as you wanted.*/
    data trans;
        set trans;
        rename _NAME_= Datetype COL1= Date;
    run; 

从肯特大学网站查看更多信息

于 2018-09-03T06:07:08.267 回答
0

两步

  • 使用 透视数据Proc TRANSPOSE
  • 更改输出列的名称及其标签PROC DATASETS

示例代码

proc transpose 
  data=have 
  out=want
    ( keep=id _label_ col1)
  ;
  by id;
  var birthday date1 date2;
  label birthday='birthday' date1='1' date2='2' ; * Trick to force values seen in pivot;
run;

proc datasets noprint lib=work;
  modify want;
  rename 
    _label_ = Datetype
    col1 = Date
  ;
  label
    Datetype = 'Datetype'
  ;
run;

TRANSPOSE 输出表中的列顺序为:

  • 标识变量
  • 复制变量
  • _name__label_
  • 基于数据的列名

示例 'want' 在_label_/_name_列之前显示名为列的数据。更改基础列顺序的唯一方法是重写数据集。您可以通过使用附加数据视图或允许您指定所需特定顺序的输出 Proc 来更改查看该顺序的方式。

于 2018-09-04T10:29:43.093 回答