[英]SAS: Selecting frequency of multi-column value
我有這個問題,但在SAS。 要使用此問題中提供的示例,我有5列名稱(name_1,name_2等),並希望輸出一個列表,其中的名稱按頻率的降序列出:
John 502
Robert 388
William 387
...
... 1
我接受了上面引用的問題的答案,並用“proc sql”包圍它。 和“退出;”:
proc sql;
create table freqs as
SELECT name, COUNT(1)
FROM ( SELECT name_1 AS name FROM mytable
UNION ALL SELECT name_2 AS name FROM mytable
UNION ALL SELECT name_3 AS name FROM mytable
UNION ALL SELECT name_4 AS name FROM mytable
UNION ALL SELECT name_5 AS name FROM mytable
) AS myunion
GROUP BY name
ORDER BY COUNT(1) DESC
;
quit;
但我得到:
ERROR: Summary functions are restricted to the SELECT and HAVING clauses only.
我使用的是SAS 9.2。
思考? 謝謝您的幫助!
您只需要更改ORDER BY表達式以引用第二列。 我還建議您將COUNT表達式結果分配給SAS變量名稱(可能是“freq”):
proc sql;
create table freqs as
SELECT name
, COUNT(*) as freq
FROM (
SELECT name_1 AS name FROM mytable
UNION ALL SELECT name_2 AS name FROM mytable
UNION ALL SELECT name_3 AS name FROM mytable
UNION ALL SELECT name_4 AS name FROM mytable
UNION ALL SELECT name_5 AS name FROM mytable
) AS myunion
GROUP BY name
ORDER BY freq DESC;
quit;
僅供參考:您也可以說ORDER BY 2 DESC
給出相對參考。
Proc SQL不允許按順序計數(1)。 試試這個:
proc sql;
create table freqs as
SELECT name, COUNT(1) as freqs
FROM (SELECT name_1 AS name FROM mytable UNION ALL
SELECT name_2 AS name FROM mytable UNION ALL
SELECT name_3 AS name FROM mytable UNION ALL
SELECT name_4 AS name FROM mytable UNION ALL
SELECT name_5 AS name FROM mytable
) AS myunion
GROUP BY name
ORDER BY 2 DESC ;
quit;
我認為它允許列引用。
如果數據集不是太大,以下可能也會起作用:
data mytable;
input (name1-name5) (: $17.) @@;
cards;
john henry bob jerry james gary bill john mark gabe
;
run;
proc sql;
select 'do name = '
||catq("A2SC", name1,name2,name3,name4,name5)
||'; output; end;' into : nlist separated by ' ' from mytable
;
quit;
data test;
&nlist
Run;
proc freq order = freq;
tables name;
run;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.