我在从宽到长格式重塑数据时遇到问题:
我希望这个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常见问题解答中的示例附近的代码段,但这会引发错误:
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);
任何想法如何重塑这个?我以前从来没有必要重塑这种奇怪的结构。
附加问题:在上面的示例中,我确实需要指定度量名称Meas0010
,Meas0020
和Meas0020A
。是否有可能实现自动化?所有度量名称都以关键字Meas
开头,因此变量名称始终为_ID + Meas
Name 结构,例如A101Meas0020A
代表身份A101
和衡量Meas0020A
。
令人烦恼的是:我确实知道如何在MATLAB中执行此操作,但我不得不在这里使用Stata。
答案 0 :(得分: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次测量。无论如何,您已经显示了删除不需要的字符串所需的语法技巧。