这是我的数据集的一个示例:
data have;
input v1 v2 $;
cards;
2015 123
2015 5a2
2015 544
2015 546
2015 678
2015 989
2016 123
2016 123
2016 222
2016 434
2016 444
2016 586
2016 675
2016 970
2016 98
2017 123
2017 123
2017 345
2017 544
2017 544
2017 675
;;;;
run;
我的目标是找出2017年和/或2015年和2016年重复值出现的比率。例如,如果“ 123”在2017年出现n次,我想计算2017年的每次重复发生,但我想计算一次在2015年或2016年发生的次数。因此,在样本数据的情况下,“ 123”的比率为0.5。因为它在2017年发生过两次,在其他两年中至少发生过一次,因此我们对2017年有6次观测。
我是sql的新手,并且一直在尝试构建此代码,但这显然对计算v1的级别没有帮助。
proc sql;
select count(distinct v1) as variablewant
from have
group by v1
;
quit;
谢谢。
编辑:
我想要的输出如下:
2017:.8333
这是因为2017年6个值中的5个发生在2017年或前两年之一。
答案 0 :(得分:0)
您可以执行自反(即自我)连接以获得结果。对于left join
,如果右表不满足on
条件,则所引用的任何右列将为null。 case
语句中使用了这一事实,以计算前几年发生的v2
的数量。
proc sql;
create table want as
select
year, sum (case when BUTTER.v2 is not null then 1 else 0 end) / count (*) as ratio
from
have as PEANUT
left join
(select distinct v2 from have where year < 2017) as BUTTER
on
PEANUT.v2 = BUTTER.v2
where
year = 2017
group by
year
;