我有以下数据集:
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为条件进行合并,但似乎并不起作用。
答案 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;
假设数据已经排序,这应该很快。