2016-08-13 27 views
0

我在從廣角重塑數據以長格式問題:整形到長時間沒有標識符

  1. 我對範圍的變量沒有標識符的變量。
  2. 我的數據集非常寬。我確實有大約7000個變量。
  3. 每個ID的變量數量不是常數,所以對於某些ID我有5個,其他ID有10個變量。

我希望這Stata FAQ可以幫助我,但不幸的是這不能正常工作(請參閱下面的代碼片段)。

所以,我有一個看起來像下面的示例數據:

clear 
input str45 Year 
"2010" 
"2011" 
"2012" 
"2014" 
end 
input str45 A101Meas0010 
"1.50" 
"1.70" 
"1.71" 
"1.71" 
input str45 A101Meas0020 
"50" 
"60" 
"65" 
"64" 
input str45 A101Meas0020A 
"51" 
"62" 
"64" 
"68" 
input str45 FE123Meas0010 
"1.60" 
"1.75" 
"1.92" 
"1.94" 
input str45 FE123Meas0020 
"60" 
"72" 
"88" 
"92" 
list 

    +-------------------------------------------------------------+ 
    | Year A10~0010 A10~0020 A1~0020A FE1~0010 FE1~0020 | 
    |-------------------------------------------------------------| 
    1. | 2010  1.50   50   51  1.60   60 | 
    2. | 2011  1.70   60   62  1.75   72 | 
    3. | 2012  1.71   65   64  1.92   88 | 
    4. | 2014  1.71   64   68  1.94   92 | 
    +-------------------------------------------------------------+ 

決賽桌我要實現的將是這個樣子:

 +--------------------------------------------------+ 
    | Year   ID Meas0010 Meas0020 Meas0020A | 
    |--------------------------------------------------| 
    1. | 2010  A101  1.50   50   . | 
    2. | 2010  FE123  1.60   51   60 | 
    3. | 2011  A101  1.70   60   . | 
    4. | 2011  FE123  1.75   62   72 | 
    5. | 2012  A101  1.71   65   . | 
    6. | 2012  FE123  1.92   64   88 | 
    7. | 2014  A101  1.71   64   . | 
    8. | 2014  FE123  1.94   68   92 | 
    +--------------------------------------------------+ 

我嘗試下面的代碼片段接近來自Stata FAQ的例子,但是這會引發一個錯誤:

unab vars : *Meas* 
local stubs : subinstr local vars "Meas0010" "", all 
local stubs : subinstr local stubs "Meas0020" "", all 
local stubs : subinstr local stubs "Meas0020A" "", all 
reshape long "`stubs'", i(Year) j(Measurement) string 
(note: j = Meas0010 Meas0020 Meas0020A) 
(note: A101AMeas0010 not found) 
variable A101Meas0010 not found 
r(111); 

任何想法h重塑這個?我以前從來不需要重塑這種奇怪的結構。

附加問題:在上面的例子中,我確實必須指定測量名稱Meas0010,Meas0020Meas0020A。這是否也可以自動化?所有測量名稱均以關鍵字Meas開頭,因此變量名稱始終爲結構_ID + Meas名稱,例如, A101Meas0020A代表ID A101和測量Meas0020A

令人討厭的是:我知道如何在MATLAB中做到這一點,但我不得不在這裏使用Stata。

+0

最好避免對任何軟件的負面評論,當你需要幫助時,即使你打算幽默。 –

+0

交叉發表於http://www.statalist.org/forums/forum/general-stata-discussion/general/1353074-reshape-from-wide-to-long-without-identifier-and-variable-number-of -stubs在任何論壇上告訴人們有關交叉發帖都很有禮貌。 –

+0

忘記提交交叉郵報是我的錯。我很抱歉。但是,我絕不會在我的帖子中對Stata發表任何言論,因此我也不接受提及的批評暗示。我在MATLAB中100%流利,可以在幾分鐘內解決這個問題。由於在這個項目中我沒有獲得MATLAB許可證,我需要用Stata解決這個問題 - 我還沒有充分了解這個軟件(並且花了3個小時沒有任何進展)。請不要誤會我的意思 - 對於我在這裏工作的特定應用程序,Stata是最好的工具之一。 – EliteTUM

回答

1

您的變量名稱結構有點尷尬,但有一個匹配的語法。最好在reshape的幫助中介紹,並且在你引用的常見問題(我寫的,所以我可以強調,它的目的是作爲幫助的補充,而不是第一行文檔)中幾乎沒有提及。

你的榜樣收益率

clear 
input str4 (Year A101Meas0010 A101Meas0020 A101Meas0020A FE123Meas0010 FE123Meas0020) 
"2010" "1.50" "50" "51" "1.60" "50" 
"2011" "1.70" "60" "62" "1.75" "60" 
"2012" "1.71" "65" "64" "1.92" "65" 
"2014" "1.71" "64" "68" "1.94" "64" 
end 
reshape long @Meas0010 @Meas0020 @Meas0020A, i(Year) j(ID) string 
destring, replace 
sort Year ID 
list, sepby(Year) 


    +-----------------------------------------------+ 
    | Year  ID Meas0010 Meas0020 Me~0020A | 
    |-----------------------------------------------| 
    1. | 2010 A101  1.5   50   51 | 
    2. | 2010 FE123  1.6   50   . | 
    |-----------------------------------------------| 
    3. | 2011 A101  1.7   60   62 | 
    4. | 2011 FE123  1.75   60   . | 
    |-----------------------------------------------| 
    5. | 2012 A101  1.71   65   64 | 
    6. | 2012 FE123  1.92   65   . | 
    |-----------------------------------------------| 
    7. | 2014 A101  1.71   64   68 | 
    8. | 2014 FE123  1.94   64   . | 
    +-----------------------------------------------+ 

看來奇怪的是你的榜樣進入一切爲字符串:注意在我的代碼destring

如果沒有訪問您的數據集,我會說你應該能夠找到沒有自動化的更一般的語法。你知道在最充分的情況下最多隻有10次測量。無論如何,您已經顯示了刪除不需要的字符串所需的語法技巧。

+0

這個解決方案非常簡單和優雅,非常感謝,Nick!提到的數據集是從Excel Sheet導入的,包含一個」wild混合「的雙打和字符串。爲了正確的錯誤處理,我打算在destringing之前檢查錯誤消息。 – EliteTUM