2016-01-20 463 views
1

我有以下數據集:計算列百分比SAS

Date  Occupation  Tota_Employed 
1/1/2005  Teacher   45 
1/1/2005  Economist  76 
1/1/2005  Artist   14 
2/1/2005  Doctor   26 
2/1/2005  Economist  14 
2/1/2005  Mathematician 10 

and so on until November 2014 

我所試圖做的是計算的按職業採用百分比的柱之間,使得我的數據會看起來像這樣:

Date  Occupation  Tota_Employed Percent_Emp_by_Occupation 
1/1/2005  Teacher   45    33.33 
1/1/2005  Economist  76    56.29 
1/1/2005  Artist   14    10.37 
2/1/2005  Doctor   26    52.00 
2/1/2005  Economist  14    28.00 
2/1/2005  Mathematician 10    20.00 

其中percent_emp_by_occupation是根據各個日期(月&年)的總和,每個職業除以total_employed計算得到的百分比:

教師示例:(45/135)* 100,其中135是45 + 76 + 14的總和

我知道我可以通過proc列表獲得表,但想知道是否有反正通過它另一個程序,特別是因爲我想這是一個單獨的數據集。

要做到這一點,最好的方法是什麼?提前致謝。

回答

1

提取月份和年份從日期和創建密鑰:

data ds; 
set ds; 
month=month(date); 
year=year(date); 
key=catx("_",month,year); 
run; 

捲起總在月級別:

Proc sql; 
create table month_total as 
select key,sum(total_employed) as monthly_total 
from ds 
group by key; 
quit; 

更新與月度統計的原始數據:

Proc sql; 
create table ds as 
select a.*,b.monthly_total 
from ds as a left join month_total as b 
on a.key=b.key; 
quit; 

這將導致以下數據集:

日期職業Tota_Employed monthly_total 1/1/2005教師45 135 1/1/2005經濟學76 135 1/1/2005藝術家14 135

最後計算的百分比爲:

data ds; 
set ds; 
percentage=total_employed/monthly_total; 
run; 
+0

謝謝噸Nirvik。我的思路是完全一樣的,不幸的是,我不擅長使用SQL。我不知道這是否也可以在沒有Proc sql的情況下完成。我認爲first.variable和last.variable可以以某種方式被使用,但是我無法將它包裹起來。 – user2916331

0

答案是回頭看看過去幾天你提出的關於這些數據的問題,並研究這些答案。你的答案在那裏。

在您查看這些答案時,請花點時間感謝他們併爲他們提供幫助您的支票。

+0

我沒有通過的答案仔細閱讀,但它不是什麼我試圖做有益的。不管怎麼說,還是要謝謝你。 – user2916331

1

在這裏你去:

proc sql; 
create table occ2 as 
select 
    occ.*, 
    total_employed/employed_by_date as percentage_employed_by_date format=percent7.1 
from 
    occ  a 
    join 
    (select 
     date, 
     sum(total_employed) as employed_by_date 
    from occ 
    group by date) b 
     on 
     a.date = b.date 
; 
quit; 

產生一個表像這樣:

enter image description here

最後一個想法:您可以在數據的一次傳遞中創建您希望進行此計算的所有總計。我查看了您詢問的有關此數據的以前的問題,並假設您使用proc means按日期和職業總結了您的初始數據。您也可以按照相同的程序按日期計算總計。我沒有你的數據,所以我將用每個SAS安裝附帶的sashelp.class數據集來說明這個概念。

在這個例子中,我想按性別和年齡得到學生總數,但我也想按性別來獲得總學生數,因爲我會在以後通過性別來計算學生的百分比。以下是如何總結數據並獲得2個不同級別摘要的計數。

proc summary data=sashelp.class; 
class sex age; 
types sex sex*age; 
var height; 
output out=summary (drop=_freq_) n=count; 
run; 

types聲明標識了我的類變量的摘要級別。在這種情況下,我想要的只是性別,以及按年齡計算的性別。這是輸出的樣子。

enter image description here

_TYPE_可變標識總結的水平。性別總數爲_TYPE_=2,而按年齡計算的性別爲_TYPE_=3

然後一個簡單的SQL查詢來計算性別中的百分比。

proc sql; 
create table summary2 as 
select 
    a.sex, 
    a.age, 
    a.count, 
    a.count/b.count as percent_of_sex format=percent7.1 
from 
    summary (where=(_type_=3)) a /* sex * age */ 
    join 
    summary (where=(_type_=2)) b /* sex */ 
     on 
     a.sex = b.sex 
; 
quit; 

enter image description here

+0

謝謝。非常感激! – user2916331