1

我有一个数据集,每人有 4 个观察值(行)。

我想创建三个新变量来计算第二行和第一行、第三行和第二行以及第四行和第三行之间的差异。

我认为保留可以做到这一点,但我不知道如何。

还是我需要一个数组?

谢谢!

4

5 回答 5

1

data test;
  input person var;
  datalines;
1 5
1 10
1 12
1 20
2 1
2 3
2 5
2 90
;
run;

data test;
  set test;
  by person notsorted;
  retain pos;
  array diffs{*} diff0-diff3;
  retain diff0-diff3;
  if first.person then do;
    pos = 0;
  end;
  pos + 1;
  diffs{pos} = dif(var);
  if last.person then output;
  drop var diff0 pos;
run;

于 2009-06-19T17:29:50.080 回答
1

为什么不使用滞后功能。

data test;  input person var;
cards; 
1 5
1 10
1 12
1 20
2 1
2 3
2 5
2 90
run;

data test;  set test;
by person; 
LagVar=Lag(Var);
difference=var-Lagvar;
if first.person then difference=.;
run;
于 2009-07-08T20:15:18.023 回答
0
data output_data;   
   retain count previous_value diff1 diff2 diff3;  
   set data input_data    
     by person;  
   if first.person then do;   
     count = 0;  
   end;  
   else do;  
     count = count + 1;  
     if count = 1 then diff1 = abs(value - previous_value);  
     if count = 2 then diff2 = abs(value - previous_value);  
     if count = 3 then do;   
       diff3 = abs(value - previous_value);   
       output output_data;   
     end;  
   end;  
   previous_value = value;  
run;
于 2009-09-29T04:46:44.140 回答
0

没有数组的替代方法。

/*-- Data from simonn's answer --*/
data SO1019005;
  input person var;
  datalines;
1 5
1 10
1 12
1 20
2 1
2 3
2 5
2 90
;
run;

/*-- Why not just do a transpose? --*/
proc transpose data=SO1019005 out=NewData;
by person;
run;

/*-- Now calculate your new vars --*/
data NewDataWithVars;
set NewData;

NewVar1 = Col2 - Col1;
NewVar2 = Col3 - Col2;
Newvar3 = Col4 - Col3;

run;
于 2009-06-23T12:37:29.280 回答
0

为什么不使用 diff() 函数呢?

/* test data */
data one;
  do id = 1 to 2;
    do v = 1 to 4 by 1;
      output;
    end;
  end;
run;
/* check */
proc print data=one;
run;
/* on lst
Obs    id    v

 1      1    1
 2      1    2
 3      1    3
 4      1    4
 5      2    1
 6      2    2
 7      2    3
 8      2    4
*/

/* now create diff within id */
data two;
  set one;
  by id notsorted; /* assuming already in order */
  dif = ifn(first.id, ., dif(v));
run;
proc print data=two;
run;
/* on lst
Obs    id    v    dif
 1      1    1     .
 2      1    2     1
 3      1    3     1
 4      1    4     1
 5      2    1     .
 6      2    2     1
 7      2    3     1
 8      2    4     1
*/
于 2009-08-20T18:21:54.670 回答