有条件删除变量值

问题描述 投票:0回答:1

假设有以下内容:

data DB;
  input ID $ Class1  Class2  Class3  Index;
cards;
0001  .   .    .   2
0001  .   .    .   2
0001  .   3.2  .   1
0001  .   3.2 5.3  .
0002 2.1  .    .   1
0002 2.1  0.2  .   .
0002  .   3.2  .   1
0002  .   3.2  1.1 .
;

有办法获得以下内容吗?

data DB1;
  input ID $ Class1  Class2  Class3  Index;
cards;
0001  .   .    .   2
0001  .   .    .   2
0001  .   3.2  .   1
0001  .   .   5.3  .
0002 2.1  .    .   1
0002  .    0.2  .  .
0002  .   3.2  .   1
0002  .    .  1.1  .
;

换句话说,当 Index = .然后删除每个类的复制值:(按 ID 复制的第二个值,但仅在 Index = 的行处。)。

提前谢谢您

sas
1个回答
0
投票

试试这个。如果你想理解逻辑,请注释掉 Drop 语句。

data want;

   set DB;
   by ID;

   array lag_{3};
   array c{*} class:;

   lag_index = ifn(first.ID, ., lag(Index));

   if lag_index = 1 then do;
      do i = 1 to dim(lag_);
         if lag_[i] = c[i] then c[i] = .;
      end;
   end;

   output;

   do i = 1 to dim(lag_);
      lag_[i] = c[i];
   end;

   retain lag_:;
   drop lag_: i lag_index;

run;

结果:

ID    Class1  Class2  Class3  Index
0001  .       .       .       2
0001  .       .       .       2
0001  .       3.2     .       1
0001  .       .       5.3     .
0002  2.1     .       .       1
0002  .       0.2     .       .
0002  .       3.2     .       1
0002  .       .       1.1     .
© www.soinside.com 2019 - 2024. All rights reserved.