2016-06-28 25 views
0

を前年のテストのスコアを作成するときに、私はこのようになりますと、私が作成しようとしている変数がMath_scoreあるいくつかのデータを持っているコードの削減:反対の対象に

Year  ID Subject Score Math_score  
2011  1  m   30   30 
2011  1  r   40   30 
2012  2  m   50   50 
2012  2  r   60   50 

私の同僚と私は出ていますこれを行うには、次の方法:

bys id year: egen math = mode(score) if subject=="m" 
by id year: egen math_score = max(math)   

または:

bys id year: gen math_score = score[_n-1] 
replace math_score = math_score[_n+1] if math_score==. 

Ultimこれは、被験者とその反対の被験者の前年度のテストスコアを示すために、遅れた変数で使用されます。より少ないコードでこれを行うもっとエレガントな方法があると確信していますが、私たちはそれを考えることはできません。何か案は?

答えて

1

これは、1つでこれを行うには非常に簡単です:

hereを文書化
clear 
input Year  ID str1 Subject Score  
2011  1  m   30   
2011  1  r   40   
2012  2  m   50   
2012  2  r   60   
end 
egen Math_Score = mean(Score/(Subject == "m")), by(ID Year) 

0または1と評価される真偽の式で除算します。結果が1の場合は、そのままScoreが使用されます。結果が0の場合、結果は欠落し、無視されます。これは正確にここで必要な結果です。

clear 
input Year  ID str1 Subject Score  
    2011  1  m   30   
    2011  1  r   40   
    2012  2  m   50   
    2012  2  r   60   
end 
reshape wide Score, i(ID Year) j(Subject) string 
list, sepby(ID) 

    +-----------------------------+ 
    | Year ID Scorem Scorer | 
    |-----------------------------| 
    1. | 2011 1  30  40 | 
    |-----------------------------| 
    2. | 2012 2  50  60 | 
    +-----------------------------+ 
:あなたは別のデータ構造を持つオフはるかに良いことがあり、言わ