2013-11-09 141 views
0

我的數據集是這樣的:如果條件取決於存在

firm_id year total_workers 
    1 1975 614 
    1 1976 68 
    1 1977 708 
    1 1978 18 
    1 1979 536 
    3 1975 154 
    3 1976 59 
    3 1977 115 
    3 1978 40 
    3 1979 380 
    4 1975 49 
    4 1976 42 
    4 1977 53 
    4 1978 54 
    4 1979 34 
    5 1975 254 
    5 1976 1115 

等等...

我想塔塔顯示所有firm_id S和相應的year中的價值total_workers比另一個year中的total_workers的值大10倍,但在同一firm_id之內。例如,關於firm_id == 1,Stata的應顯示firm_id ==1year == 1977(它不必須以這種方式精確地顯示),因爲在1977年total_workerstotal_workers大於1976年

10倍以上由於命令display沒有按在這種情況下似乎不起作用,我使用了命令tab,這或多或少不是令人滿意的替代品。但是,我的總體命令不起作用。看起來這是第一次嘗試....:

by firm_id: tab firm_id year if total_workers >10*total_workers 

正如你可以看到,它的方式應該是沒有指定if條件。

回答

1

看來你只是想比較連續兩年(按公司),它可以這樣做:

clear all 
set more off 

input firm_id year total_workers 
    1 1975 614 
    1 1976 68 
    1 1977 708 
    1 1978 18 
    1 1979 536 
    3 1975 154 
    3 1976 59 
    3 1977 115 
    3 1978 40 
    3 1979 380 
    4 1975 49 
    4 1976 42 
    4 1977 53 
    4 1978 54 
    4 1979 34 
    5 1975 254 
    5 1976 1115 
end 

sort firm_id year // important 
list, sepby(firm_id) 

by firm_id: gen flag = (total_workers[_n] > 10*total_workers[_n-1]) 
list if flag == 1 

重要的點是sort和使用subscripting

爲了讓一條線較短,您可以納入sort到主指令是這樣的:

bysort firm_id (year): gen flag = (total_workers[_n] > 10*total_workers[_n-1]) 

您的代碼不工作的原因是,塔塔評估它的數據集 逐行(即通過從上到下的觀察觀察) - 如果在這裏出現錯誤,我讚賞 的任何更正。 您只是要求Stata 僅當一個觀察到的變量實例大於它自身乘以10 (這是不可能的)(即始終爲false)時纔會製表。請參閱以下的輸出:

bysort firm_id (year): gen flag = 1 if total_workers > 10*total_workers 

使用標明確,前行相當於

bysort firm_id (year): gen flag = 1 if total_workers[_n] > 10*total_workers[_n] 
+0

非常感謝您的回答!這是我想要的。如果我還想在** total_workers [_n-1]> 10 * total_workers [_n] **的情況下涵蓋案例,我該如何更改代碼? –

+0

不客氣。你可以更加明確地描述「確切」你所尋求的東西。這可能需要更多時間來發布/編輯您的問題,但從長遠來看,這對每個人來說都更有效率。 –

+0

對不起,我很抱歉。 –