为组创建值 - SAS

时间:2018-03-26 21:18:58

标签: sas grouping

data test;
input Index Indicator value FinalValue;
datalines;

1 0  5   21
1 1  21  21
2 1  0   0
3 0  4   7
3 1  7   7
3 0  8   7
3 0  2   7
4 1  1   1
4 0  4   1
;
run;

我有一个包含前3列的数据集。如何根据指标获得第4列?例如,对于索引,当指标= 1时,值为21,所以我把21放在索引1的所有行中的最终值。

3 个答案:

答案 0 :(得分:2)

通过左连接使用proc sql。选择哪个指标= 1并按索引分组,然后左连接原始数据集。你的第一行索引= 3应该是7,而不是0。

proc sql;
   select a.*,b.finalvalue from test a 
   left join (select *,value as finalvalue from test group by index having indicator=1) b
   on a.index=b.index;
quit;

答案 1 :(得分:2)

使用SAS Retain关键字。

您可以在数据步骤中执行此操作;通过保留指标= 1的值。

步骤:

  • 按索引和指标对数据进行排序
  • 指数分组&保留指标= 1的值

代码:

/*Sort Data by Index and Indicator & remove the hardcodeed finalvalue*/
proc sort data=test (keep= Index Indicator value); 
by index descending indicator ;
run;

/*Retain the FinalValue*/
data want;
set test;
retain FinalValue;
keep Index Indicator value FinalValue;
if indicator =1 then do;FinalValue=value;end;
/*The If statement below will assign . to records that doesn't have an indicator value of 1*/
if  indicator ne 1 and FIRST.Index=1 then FinalValue=.;
by index;
run;

输出:

Index=1 Indicator=1 value=21 FinalValue=21 
Index=1 Indicator=0 value=5 FinalValue=21 
Index=2 Indicator=1 value=0 FinalValue=0 
Index=3 Indicator=1 value=7 FinalValue=7 
Index=3 Indicator=0 value=4 FinalValue=7 
Index=3 Indicator=0 value=8 FinalValue=7 
Index=3 Indicator=0 value=2 FinalValue=7 
Index=4 Indicator=1 value=1 FinalValue=1 
Index=4 Indicator=0 value=4 FinalValue=1 

答案 2 :(得分:0)

这是相当古老的学校,但应该足够了。我估计你称之为自我合并或其他什么。

data test;
   input Index Indicator value;* FinalValue;
   datalines;
1 0  5   21
1 1  21  21
2 1  0   0
3 0  4   7
3 1  7   7
3 0  8   7
3 0  2   7
4 1  1   1
4 0  4   1
;;;;
   run;
data final;
   if 0 then set test;
   merge test(where=(indicator eq 1) rename=(value=FinalValue)) test;
   by index;
   run;
proc print;
   run;


                                      Final
Obs    Index    Indicator    value    Value

 1       1          0           5       21
 2       1          1          21       21
 3       2          1           0        0
 4       3          0           4        7
 5       3          1           7        7
 6       3          0           8        7
 7       3          0           2        7
 8       4          1           1        1
 9       4          0           4        1