在SAS中进行长距离转换

时间:2016-06-07 02:09:50

标签: sas subset large-data

我有一个非常大的数据集(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;

所需的输出格式: enter image description here

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

3 个答案:

答案 0 :(得分: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 

加州大学洛杉矶分校的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

答案 1 :(得分:0)

使用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.Too中没有好的转置程序。

答案 2 :(得分:0)

以下是“数据准备分析”一书中战斗宏测试的链接

从sas社区维基中,您可以下载宏定义。

转到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,您可以在此下载该书的所有宏,程序和数据集。

希望这个帮助