SAS:基于几种条件的ID变量

时间:2017-07-27 10:50:12

标签: sas

我有以下数据集:

ID      Status   
1       cake
1       cake
1       flower
2       flower
2       flower
3       cake
3       flower
4       cake
4       cake
4       cake

基本上,我只对按ID分组的观察结果感兴趣,至少包含一朵花。另外,我想要说明按ID分组的观察是否只有花或是否也是蛋糕。例如。理想情况下我喜欢这样的东西:

ID      Status      Indicator
1       cake        1
1       cake        1
1       flower      1
2       flower      2
2       flower      2
3       cake        1
3       flower      1
4       cake        0
4       cake        0
4       cake        0

我尝试以多种方式对数据集进行子集化并以ID为条件进行合并,但似乎并不起作用。

3 个答案:

答案 0 :(得分:1)

脑海中浮现出

str_replace(my_fruits, "\\([^()]{0,}\\)", "") ## "goodapple" "apple" "(funnyapple"

proc sql

proc sql; select t.*, tt.indicator from t join (select id, sum(case when status = 'flower' then 1 else 0 end) as indicator from t group by id ) tt on tt.id = t.id; 还有一个" remerge" SQL扩展。这允许你这样做:

proc sql

答案 1 :(得分:1)

基于您输入的SAS数据步骤(我在此称为测试)将按ID组返回该指标值。

proc sort data=test;
by ID descending status;
run;

data result(drop=status);
set test;
by ID;
retain indicator;
if first.ID then indicator=0;
if status='flower' and indicator=0 then indicator=2;
if status='cake' and indicator=2 then indicator=1;
if last.ID then output;
run;

您可以将该结果与源数据结合,以获得您在帖子中提供的结果。

注意:我没有足够的声誉来评论Gordon Linoff提供的答案,但我只想指出指标不会带有三个值(0='no flower',{{1} },1='cake+flower'),而是计算花的数量。每个ID的条目,我不认为这是海报要求的。

重写如下将给出指标值2='only flower'0='no flower'1='only flower'

的预期结果
2='cake+flower'

答案 2 :(得分:1)

如果您的数据已经按ID排序,那么您可以使用双DOW循环。第一个循环将检查值的存在。然后,您可以使用另一个循环来回写该组的所有详细信息行。

data want ;
  do until (last.id);
    set have;
    by id;
    if status='flower' then _flower=1;
    else if status='cake' then _cake=1;
  end;
  if _flower and _cake then indicator=1;
  else if _flower then indicator=2;
  else indicator=0;
  do until (last.id);
    set have;
    by id;
    output;
  end;
run;

假设数据已经排序,这应该很快。