Как посчитать повторяющиеся значения по уровням - PullRequest
0 голосов
/ 07 декабря 2018

Вот пример моего набора данных:

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' происходит nВ 2017 году я хочу посчитать каждое повторение в 2017 году, но хочу посчитать, сколько раз это произошло в 2015 или 2016 году один раз.Таким образом, в случае данных выборки ставка для «123» будет равна .5.Потому что это происходит дважды в 2017 году и, по крайней мере, один раз за два других года, и у нас есть 6 наблюдений за 2017 год.это не помогает мне при подсчете уровней v1.

 proc sql;
    select count(distinct v1) as variablewant 
            from have
                group by v1
;
quit;

Спасибо.

Редактировать:

Мой желаемый результат будет следующим:

2017: .8333

Это связано с тем, что 5 из 6 значений в 2017 г. встречаются либо в 2017 г., либо в одном из двух предыдущих лет.

1 Ответ

0 голосов
/ 07 декабря 2018

Вы можете выполнить рефлексивное (то есть само) соединение, чтобы получить результат.В случае left join, когда правая таблица не удовлетворяет условию on, любые правые столбцы, на которые ссылаются, будут нулевыми.Этот факт используется в операторе 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
  ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...