使用SAS中的数组将宽转置为长

使用SAS中的数组将宽转置为长,sas,Sas,我有一个SAS数据集,包含以下变量:ID、Var1_0、Var1_3、Var1_6、Var2_0、Var2_3、Var2_6,可以这样读取:Var1_0是时间0的参数1。对于每个科目,我有2个变量和3个时间点。我想使用数组将其转换为长格式,我这样做了: data long; set wide; array a Var1_0 Var1_3 Var1_6 Var2_0 Var_3 Var_6; Do i=1 to dim(a); outcome = a[i];

我有一个SAS数据集,包含以下变量:ID、Var1_0、Var1_3、Var1_6、Var2_0、Var2_3、Var2_6,可以这样读取:Var1_0是时间0的参数1。对于每个科目,我有2个变量和3个时间点。我想使用数组将其转换为长格式,我这样做了:

data long;
    set wide;
    array a Var1_0 Var1_3 Var1_6 Var2_0 Var_3 Var_6;
    Do i=1 to dim(a);
        outcome = a[i];
        *Var = ???;
        if (mod(i,3)=1) then Time = 0;
            else if (mod(i,3)=2) then Time = 3;
                else Time = 6;
        Output;
    end;
    keep ID Outcome Time;
run;

问题是我不知道如何计算参数变量,也就是说,我想添加一个1或2的变量,这取决于该值与哪个参数相关。有更好的方法吗?谢谢大家!

Reeza在她的评论中给了你答案。这是打印出来的

data long;
   set wide;
   array a[*] Var1_0 Var1_3 Var1_6 Var2_0 Var2_3 Var2_6;
   do i=1 to dim(a);
      outcome = a[i];
      var = vname(a[i]);
      time = input(scan(var,2,'_'),best.);
      /*Other stuff you want to do*/
      output;
   end;
run;
VNAME(array[sub])
提供由array[sub]引用的变量的变量名


scan(str,i,delim)
使用指定的分隔符为您提供
str
中的第i个单词。

Reeza在她的评论中为您提供了答案。这是打印出来的

data long;
   set wide;
   array a[*] Var1_0 Var1_3 Var1_6 Var2_0 Var2_3 Var2_6;
   do i=1 to dim(a);
      outcome = a[i];
      var = vname(a[i]);
      time = input(scan(var,2,'_'),best.);
      /*Other stuff you want to do*/
      output;
   end;
run;
VNAME(array[sub])
提供由array[sub]引用的变量的变量名


scan(str,i,delim)
使用指定的分隔符提供
str
中的第i个单词。

查看vname函数以获取变量名。您也可以通过这种方式获取时间。你们也可以这样打发时间。谢谢你们!代码缺少“output;”,但除此之外,它工作得非常好。谢谢你们!代码缺少“output;”,但除此之外,它工作得非常好。