在没有标识符的情况下从宽到长重塑
Reshape from wide to long without Identifier
我在将数据从宽格式重塑为长格式时遇到问题:
- 我没有宽变量的标识符变量。
- 我的数据集非常广泛。我确实有大约 7000 个变量。
- 每个 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 |
+-------------------------------------------------------------+
我想要实现的最终 table 看起来像这样:
+--------------------------------------------------+
| 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
代表 ID A101
和 Measurement Meas0020A
.
烦人的是:我知道如何在 MATLAB 中执行此操作,但我不得不在这里使用 Stata。
你的变量名结构有点别扭,不过有语法可以匹配。它在 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 个测量值。无论如何,您已经展示了删除不需要的字符串所需的语法技巧。
我在将数据从宽格式重塑为长格式时遇到问题:
- 我没有宽变量的标识符变量。
- 我的数据集非常广泛。我确实有大约 7000 个变量。
- 每个 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 |
+-------------------------------------------------------------+
我想要实现的最终 table 看起来像这样:
+--------------------------------------------------+
| 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
代表 ID A101
和 Measurement Meas0020A
.
烦人的是:我知道如何在 MATLAB 中执行此操作,但我不得不在这里使用 Stata。
你的变量名结构有点别扭,不过有语法可以匹配。它在 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 个测量值。无论如何,您已经展示了删除不需要的字符串所需的语法技巧。