Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SAS-创建具有滞后的不同独立变量的组合_Sas - Fatal编程技术网

SAS-创建具有滞后的不同独立变量的组合

SAS-创建具有滞后的不同独立变量的组合,sas,Sas,我想在一个数据集中(SAS中)创建动态条目,该数据集使用变量名(例如VarA、VarB、VarC)形成,每个变量的滞后时间最多为4个 输入数据集具有以下信息(列名为变量和值): 所需的输出数据集应该如下所示(Var1、Var2和Var3是动态列名,即在任何字符串Var后面追加1、2、3) 目的是对have数据集中的任意数量的变量进行这项工作 谢谢以下代码返回您想要的内容。请根据您的需要进行修改 /*sample input dataset*/ data have; input Variables

我想在一个数据集中(SAS中)创建动态条目,该数据集使用变量名(例如VarA、VarB、VarC)形成,每个变量的滞后时间最多为4个

输入数据集具有以下信息(列名为变量和值):

所需的输出数据集应该如下所示(Var1、Var2和Var3是动态列名,即在任何字符串Var后面追加1、2、3)

目的是对have数据集中的任意数量的变量进行这项工作


谢谢

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

/*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 

这个问题对我来说没有多大意义。你能不能对你正在做的事情给出一个更全面的解释,或者弄清楚这些数据集中到底应该是什么?WANT是否实际包含VarA、VarA1等中的值,或者是文本“VarA1”等?Joe,很抱歉不清楚。这些都只是文字。基本上,将形成新的变量名,其中原始变量名将从“变量”列中获得(最后一个变量名为“滞后”),滞后数将从变量“滞后”对应的值列中获得。HAVE数据集中的最后一个变量始终为“滞后”。在上述情况下,这意味着创建与VarA、VarB、VarC相对应的新变量,所有变量最多有4个滞后。此阶段只需要文本名。@user2508567很高兴这对您有用。请你勾选我答案上的向上箭头,这样我的答案就被接受了。
/*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