假设有以下内容:
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 = 的行处。)。
提前谢谢您
试试这个。如果你想理解逻辑,请注释掉 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 .