2013-06-21 28 views
0

我想在使用变量名称(例如VarA,VarB,VarC)组成的数据集(SAS)中创建动态条目,每个变量名最多可以有4个。SAS - 创建具有滞后的不同独立变量的组合

输入数据集HAVE具有此信息(列名称变量和值):

Variables Values 

VarA   0 

VarB   0 

VarC   0 

Lags   4 

和输出数据集WANT应该像下面(VAR1,VAR2,和VAR3是动态列名称即1,2,3附加到任何字符串Var)

Var1  Var2  Var3 

VarA  VarB  VarC 

VarA1 VarB1  VarC1 

.. 

VarA4 VarB4  VarC4 

其目的是为HAVE数据集中的任意数量的变量进行此项工作。

谢谢

+0

这个问题并没有多大意义了我。你可以给出一个更大的图片来解释你正在做什么,或者清楚这些数据集中究竟应该是什么? WANT实际上是否包含VarA,VarA1等的值,还是文本“VarA1”等? – Joe

+0

乔,抱歉不清楚。这些都只是文字。基本上新的变量名将在HAVE“变量”列中可用的原始变量名称(除了最后一个是“滞后”)以及滞后的数目将从对应于变量的VALUE列可用 - “滞后” 。 HAVE数据集中的最后一个变量将始终为“滞后”。在上面这种情况下,意味着创建与VarA,VarB,VarC相对应的新变量,所有这些变量都可以达到4个滞后时间。只需在这个阶段的文字名称是必需的。 – user2508567

回答

1

以下代码返回所需内容。请根据您的需要进行修改。

/*sample input dataset*/ 
data have; 
input Variables $ Values; 
datalines; 
VarA 0 
VarB 0 
VarC 0 
Lags 4 
; 
run; 
/*get the no. of lags form the input dataset*/ 
proc sql noprint; 
select Values into :num_of_lags from have where upcase(variables)='LAGS'; 
quit; 
/*transpose the input dataset such that the VarA, VarB, VarC are put in columns Var1, Var2, & Var3 respectively*/ 
/*have_t, the transposed dataset only has 1 row.*/ 
proc transpose data = have out = have_t(drop = _name_) prefix = var; 
where upcase(variables) ne 'LAGS'; 
var variables; 
run; 
/*replicate the 1 row in have_t num_of_lags times*/ 
data pre_want; 
    set have_t; 
    array myVars{*} _character_; 
     do j= 1 to &num_of_lags+1; 
      do i = 1 to dim(myVars); 
      myVars[i]=myVars[i]; 
      end; 
     output; 
    end; 
run; 
/*final dataset*/ 
data want; 
set pre_want; 
array myVars{*} _character_; 
if _N_>1 then do; 
do i = 1 to dim(myVars); 
     myVars[i]=compress(myVars[i]!!_n_-1); 
    end; 
end; 
drop i j; 
run; 
proc print data = want; run; 

输出:

var1 var2 var3 
VarA VarB VarC 
VarA1 VarB1 VarC1 
VarA2 VarB2 VarC2 
VarA3 VarB3 VarC3 
VarA4 VarB4 VarC4 
+0

谢谢@ user1509107,为我工作! – user2508567

+0

@ user2508567很高兴为您工作。请你可以在我的答案上打勾,这样就可以算出我的答案被接受了。 – 2013-06-25 14:03:46

+0

当然,这个社区是新手。不要有上升的声誉,只是明显被接受。 – user2508567