Нужен же вывод в sas - PullRequest
0 голосов
/ 11 июля 2019

Итак, у меня есть следующие данные:

Data Cricket; 
  input match $; 
  cards; 
    IndVsPak 
    NezVsAus 
    PakVsInd 
    WesVsPak 
    WesVsAus 
    IndVsPak 
    AusVsNez 
; run;

Нужен вывод:

Match Count 
IndVsPak 3 
NezVsAus 2 
WesVsPak 1 
WesVsAus 1

Пожалуйста, помогите с кодом, сколько способов мы получаем вышеупомянутый вывод?

Ответы [ 3 ]

3 голосов
/ 11 июля 2019

Попробуйте:

Data Cricket; 
  input match $; 
  cards; 
IndVsPak 
NezVsAus 
PakVsInd 
WesVsPak 
WesVsAus 
IndVsPak 
AusVsNez 
;
run;

/*standardise team order within each match - easier to do in data step*/
data temp /view = temp;
  set cricket;
  team1 = substr(match,1,3);
  team2 = substr(match,6,3);
  call sortc(of team:);
  match_sorted = cats(team1,'Vs',team2);
run;

proc sql noprint;
  create table want as
  select match_sorted, count(match_sorted) as freq 
    from temp 
    group by match_sorted
    order by freq descending
   ;
quit;

Вывод:

  match_
  sorted     freq

 IndVsPak      3
 AusVsNez      2
 AusVsWes      1
 PakVsWes      1

Вот моя попытка сделать это полностью в proc sql:

proc sql noprint;
  create table want as
  select 
    ifc(
      team1 < team2, 
      cats(team1, 'Vs', team2), 
      cats(team2, 'Vs', team1)
    ) as match_sorted length=8, 
    count(calculated match_sorted) as freq
    from (
      select
        substr(match,1,3) as team1,
        substr(match,6,3) as team2
        from cricket
    ) 
    group by match_sorted
    order by freq descending
   ;
quit;

NB это используетвычисляемое поле - немного SAS-специфической SQL-функциональности.Вы можете устранить это, настроив все это как подзапрос, выдающий match_sorted, или вы можете сгладить запрос и использовать вычисляемые поля для всего.

2 голосов
/ 11 июля 2019

Это также будет работать, если вам удобнее использовать SQL:

PROC SQL;
  SELECT match, count(*) AS cnt FROM cricket GROUP BY match;
QUIT;
2 голосов
/ 11 июля 2019

Добрый день, в SAS (почти) все делается через PROCS .Вид макросов, выполняющих действия.

В этом случае я предлагаю использовать Proc freq

Data Cricket; 
    input match $10.; 
    cards; 
    IndVsPak 
    NezVsAus 
    PakVsInd
    WesVsPak 
    WesVsAus 
    IndVsPak 
    AusVsNez 
; run;


proc freq data=Cricket noprint; 
    table match /  out= freqs ; 
run;

Вы можете увидеть вывод, удалив опцию noprint.

...