我有一个SAS数据集(按ID分组,Sub_ID按ID排序),如下所述,
ID Sub_ID Field_1 Field_2
1 4 4 8
1 5 9 5A
所需的输出(输出数据集中不需要Sub_ID)
ID Field_1 Field_2
1 4 5A
我想做什么?
我需要为每个ID提供一个单行输出,其中Field_1的值应与该特定ID的第一次出现相同,而Field_2应当与该特定ID的最后一次出现相同。
如果我使用First.ID,则输出为
ID Field_1 Field_2
1 4 8
如果我使用Last.ID,则输出为
ID Field_1 Field_2
1 9 5A
我不确定如何结合这两个条件。
答案 0 :(得分:0)
您需要做的就是将第一个值存储在新变量中(使用retain
语句将其复制到行中),然后在达到每个ID的最后一个值时输出。
以下代码将根据数据的当前排序顺序执行此操作。我假设您的真实数据有一个额外的变量,可以对数据进行正确的排序。
data have;
input ID Field_1 Field_2 $;
datalines;
1 4 8
1 9 5A
;
run;
data want;
set have;
by id;
retain field_1_1st;
if first.id then field_1_1st = field_1;
if last.id then do;
field_2_last = field_2;
output;
end;
drop field_1 field_2;
run;
答案 1 :(得分:0)
@longfish答案是完美的,这只是SQL中的另一种方式。
data have;
input ID Field_1 Field_2 $;
datalines;
1 4 8
1 5 9
1 9 5A
;
data have_1/view=have_1;
set have;
val =_n_;
run;
proc sql;
create table want as
select id, field_1,
max(case when Field_2 =(select field_2 from have_1
group by id having val=max(val))
then field_2 end) as field_2
from have_1
group by id
having val=min(val);
答案 2 :(得分:0)
这是另一个数据步骤解决方案,使用DOW循环而不是保留:
data have;
input ID Field_1 Field_2 $;
datalines;
1 4 8
1 9 5A
;
run;
data want;
do until(last.id);
set have;
by id;
if first.id then field_1_1st = field_1;
end;
field_1 = field_1_1st;
drop field_1_1st;
run;
这将轮流加载每一行,但仅输出每个id的最后一行,因此您不必特殊处理该行。
仅当您的输入数据集不包含名为field_1_1st
的字段时,此方法才有效。如果是这样,则不会结转每个id的第一行中的值。