【问题标题】:Transpose long to wide in SAS在 SAS 中将长转换为宽
【发布时间】:2016-10-06 19:36:21
【问题描述】:

我有一个非常大的数据集(1800 万个观测值),我想通过基于一个变量的子集进行转置,并从这些子集中创建 900 个新变量。下面的示例代码和所需的输出格式: 示例数据:

data long1 ; 
  input famid year faminc ; 
cards ; 
var1 96 40000 
var1 97 40500 
var1 98 41000 
var2 96 45000 
var2 97 45400 
var2 98 45800 
var3 96 75000 
var3 97 76000 
var3 98 77000 
; 
run;

代码:

proc transpose data = data; by famid; var faminc; run;

所需的输出格式:

由于我的数据集的大小,我想知道我是否使用 do 循环来查找每个 var 的第一个和最后一个观察结果,然后迭代子集。有谁知道实现所需输出格式的 sql 或 proc?

【问题讨论】:

  • 您的问题是如何使proc transpose 工作,或者如何做比排序和proc 转置更有效的事情?
  • 我会评论说,使用宽格式可能无济于事,几乎总是进一步处理长格式更容易。

标签: sas subset large-data


【解决方案1】:

这里是“数据准备分析”一书中经过良好测试的战斗宏的链接

您可以从 sas 社区 wiki 下载宏定义。

转到 http://support.sas.com/kb/32/121.html 用于从 WIDE 转置到 LONG,转到 http://support.sas.com/kb/32/122.html 用于从 LONG 转置到 WIDE。

有关“分析数据准备”的更多详细信息,请访问http://www.sascommunity.org/wiki/Data_Preparation_for_Analytics,您可以在其中下载本书的所有宏、程序和数据集。

希望有帮助

【讨论】:

    【解决方案2】:

    我不确定您的子集将基于什么,但如果它只是 id,它相当简单。

    使用来自this ucla's page on proc sort 的示例,您的示例可以使用稍微修改的输入数据正常工作:

    data long; 
      input id year faminc ; 
      datalines ; 
    1 96 40000 
    1 97 40500 
    1 98 41000 
    2 96 45000 
    2 97 45400 
    2 98 45800 
    3 96 75000 
    3 97 76000 
    3 98 77000 
    ; 
    
    proc sort data=long;
      by year;
    run;
    
    proc transpose data=long out=wide(drop=_name_) prefix=var; 
      by year; 
      var faminc; 
    run;
    

    结果

    year var1  var2  var3 
    96   40000 45000 75000 
    97   40500 45400 76000 
    98   41000 45800 77000 
    

    UCLA 的 SAS 帮助页面在双向使用 proc transpose 方面比 SAS 自己的要清楚得多。这里有 4 个有价值的链接...

    Long to Wide with Proc Transpose
    Wide to Long with Proc Transpose

    Long to Wide with Data Step
    Wide to Long with Data Step

    【讨论】:

    • 我没有意识到 OP 没有成功实现 transpose 步骤。感谢您指出这一点,知道如何proc transpose 是很重要的。
    【解决方案3】:

    使用array 语句可以轻松完成这样的转置步骤。您的代码示例如下:

    data new (keep = year var1-var3);
      set data;
      by year;
      array vars {3} var1-var3;
      retain var1-var3;
      if first.year then i=1;
      else i+1;
      vars{i} = faminc;
      if last.year then output;
    run;
    

    但我没有 SAS 来仔细检查这一点。另见here

    PROC SQL 中没有好的转置过程。太有限了。

    【讨论】:

    • 感谢您的回复,非常有帮助。我的变量名实际上是没有一致命名约定的字符串,所以它们不是 var1-... 正如我在代码中所写的那样。数组技术是否适用于这种类型的数据?
    • 是的,所需要的只是在数组语句中列出变量。如果您的数据集中有一个包含新变量名称的变量,proc transpose 具有 IDLABELID 语句来创建变量名称。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-04
    • 2016-11-26
    • 2017-03-07
    • 2022-01-24
    相关资源
    最近更新 更多