4578 9

[编程问题求助] 帮我检查下下面的stata代码错误在哪。我想做的是一个地区代码的修改 [推广有奖]

  • 16关注
  • 7粉丝

已卖:775份资源

讲师

19%

还不是VIP/贵宾

-

威望
0
论坛币
2546 个
通用积分
161.0100
学术水平
13 点
热心指数
20 点
信用等级
13 点
经验
23879 点
帖子
252
精华
0
在线时间
559 小时
注册时间
2017-6-14
最后登录
2024-5-19

楼主
经济学小小白 发表于 2019-10-19 22:12:07 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
我程序的意思是对于dqdm_error.dta中的dqdm,sort panelid year 后,如果该行的panelid和上一行的panelid相同,但与上一行的dqdm不同,则将该行的dqdm等于上一行的地区代码。如果该行的panelid和下一行的panelid相同,但与下一行的dqdm不同,则将该行的dqdm等于下一行的地区代码。  再后面依次是上两行、三行和下两行、三行。

可是我执行后,全部都是(0 real changes made)。但是我打开数据看,又有很多是符号我代码的条件的,为什么还是(0 real changes made)呢?  我检查了我的代码,也没有发现错误。请大佬帮忙看看。在此感谢各位

我的代码如下
  1. use dqdm_error.dta,clear
  2. levelsof dqdm
  3. use industrynew.dta,clear
  4. sort panelid year
  5. bys panelid: gen n=_n
  6. order qymc panelid year n dqdm
  7. foreach code in `r(levels)' {
  8.         display in red "`code'"
  9.         levelsof n if dqdm==`code'
  10.         foreach v in `r(levels)' {
  11.                 display in yellow "`v'"
  12.                 if (panelid[`v']==panelid[`v'-1] & ///
  13.                 dqdm[`v'-1]~=`code') {
  14.                         replace dqdm=dqdm[`v'-1] in `v'
  15.                 }
  16.                 if (panelid[`v']==panelid[`v'+1] & ///
  17.                 dqdm[`v'+1]~=`code') {
  18.                         replace dqdm=dqdm[`v'+1] in `v'
  19.                 }
  20.                 if (panelid[`v']==panelid[`v'-2] & ///
  21.                 dqdm[`v'-2]~=`code') {
  22.                         replace dqdm=dqdm[`v'-2] in `v'
  23.                 }
  24.                 if (panelid[`v']==panelid[`v'+2] & ///
  25.                 dqdm[`v'+2]~=`code') {
  26.                         replace dqdm=dqdm[`v'+2] in `v'
  27.                 }
  28.                 if (panelid[`v']==panelid[`v'-3] & ///
  29.                 dqdm[`v'-3]~=`code') {
  30.                         replace dqdm=dqdm[`v'-3] in `v'
  31.                 }
  32.                 if (panelid[`v']==panelid[`v'+3] & ///
  33.                 dqdm[`v'+3]~=`code') {
  34.                         replace dqdm=dqdm[`v'+3] in `v'
  35.                 }
  36.         }
  37. }
复制代码
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:Stata tata Industry replace foreach

沙发
经济学小小白 发表于 2019-10-19 22:23:21
我用dataex截取了部分数据,代码如下
  1. [CODE]
  2. * Example generated by -dataex-. To install: ssc install dataex
  3. clear
  4. input float(panelid year) long dqdm
  5. 274517 2008 441901
  6. 287545 2008 441901
  7. 287545 2011 441901
  8. 287545 2012 441901
  9. 287557 2008 442001
  10. 287557 2011 442001
  11. 287557 2012 442001
  12. 304543 2008 441901
  13. 304543 2011 441901
  14. 304543 2012 441901
  15. 304547 2008 441901
  16. 304547 2011 441901
  17. 304547 2012 441901
  18. 304549 2011 441901
  19. 304549 2012 441901
  20. 304552 2008 441901
  21. 304552 2011 441901
  22. 304552 2012 441901
  23. 304561 2008 441901
  24. 304561 2011 441901
  25. 304561 2012 441901
  26. 304563 2008 441901
  27. 304563 2011 441901
  28. 304563 2012 441901
  29. 304585 2011 441901
  30. 304585 2012 441901
  31. 304598 2008 441901
  32. 304607 2007 441901
  33. 304607 2010 441901
  34. 304623 2007 441901
  35. 304623 2008 441901
  36. 304623 2010 441901
  37. 304636 2011 441901
  38. 304636 2012 441901
  39. 304645 2008 441901
  40. 304645 2011 441901
  41. 304645 2012 441901
  42. 304674 2008 441901
  43. 304679 2008 441901
  44. 304679 2011 441901
  45. 304679 2012 441901
  46. 304681 2008 441901
  47. 304681 2011 441901
  48. 304681 2012 441901
  49. 304684 2007 441901
  50. 304684 2008 441901
  51. 304684 2010 441901
  52. 304684 2011 441901
  53. 304684 2012 441901
  54. 304691 2008 441901
  55. 304691 2011 441901
  56. 304691 2012 441901
  57. 304694 2008 441901
  58. 304698 2008 441901
  59. 304702 2008 441901
  60. 304705 2008 441901
  61. 304711 2008 441901
  62. 304715 2008 441901
  63. 304722 2008 441901
  64. 304722 2011 441901
  65. 304722 2012 441901
  66. 304725 2008 441901
  67. 304728 2008 441901
  68. 304728 2011 441901
  69. 304728 2012 441901
  70. 304730 2008 441901
  71. 304731 2008 441901
  72. 304744 2008 441901
  73. 304744 2011 441901
  74. 304744 2012 441901
  75. 304750 2008 441901
  76. 304750 2011 441901
  77. 304750 2012 441901
  78. 304754 2008 441901
  79. 304754 2011 441901
  80. 304754 2012 441901
  81. 304755 2008 441901
  82. 304783 2008 441901
  83. 304783 2011 441901
  84. 304783 2012 441901
  85. 304791 2008 441901
  86. 304791 2011 441901
  87. 304791 2012 441901
  88. 304794 2008 441901
  89. 304794 2011 441901
  90. 304794 2012 441901
  91. 304799 2008 441901
  92. 304799 2011 441901
  93. 304799 2012 441901
  94. 304806 2008 441901
  95. 1104515 2008 441901
  96. 1104515 2011 441901
  97. 1104515 2012 441901
  98. 304823 2008 441901
  99. 304832 2008 441901
  100. 304832 2012 441901
  101. 304857 2008 441901
  102. 304857 2011 441901
  103. 304857 2012 441901
  104. 304862 2008 441901
  105. end
复制代码

[/code]

藤椅
经济学小小白 发表于 2019-10-19 22:24:24
我截取了部分数据如下,请大家帮我检查下,谢谢了
  1. [CODE]
  2. * Example generated by -dataex-. To install: ssc install dataex
  3. clear
  4. input float(panelid year) long dqdm
  5. 274517 2008 441901
  6. 287545 2008 441901
  7. 287545 2011 441901
  8. 287545 2012 441901
  9. 287557 2008 442001
  10. 287557 2011 442001
  11. 287557 2012 442001
  12. 304543 2008 441901
  13. 304543 2011 441901
  14. 304543 2012 441901
  15. 304547 2008 441901
  16. 304547 2011 441901
  17. 304547 2012 441901
  18. 304549 2011 441901
  19. 304549 2012 441901
  20. 304552 2008 441901
  21. 304552 2011 441901
  22. 304552 2012 441901
  23. 304561 2008 441901
  24. 304561 2011 441901
  25. 304561 2012 441901
  26. 304563 2008 441901
  27. 304563 2011 441901
  28. 304563 2012 441901
  29. 304585 2011 441901
  30. 304585 2012 441901
  31. 304598 2008 441901
  32. 304607 2007 441901
  33. 304607 2010 441901
  34. 304623 2007 441901
  35. 304623 2008 441901
  36. 304623 2010 441901
  37. 304636 2011 441901
  38. 304636 2012 441901
  39. 304645 2008 441901
  40. 304645 2011 441901
  41. 304645 2012 441901
  42. 304674 2008 441901
  43. 304679 2008 441901
  44. 304679 2011 441901
  45. 304679 2012 441901
  46. 304681 2008 441901
  47. 304681 2011 441901
  48. 304681 2012 441901
  49. 304684 2007 441901
  50. 304684 2008 441901
  51. 304684 2010 441901
  52. 304684 2011 441901
  53. 304684 2012 441901
  54. 304691 2008 441901
  55. 304691 2011 441901
  56. 304691 2012 441901
  57. 304694 2008 441901
  58. 304698 2008 441901
  59. 304702 2008 441901
  60. 304705 2008 441901
  61. 304711 2008 441901
  62. 304715 2008 441901
  63. 304722 2008 441901
  64. 304722 2011 441901
  65. 304722 2012 441901
  66. 304725 2008 441901
  67. 304728 2008 441901
  68. 304728 2011 441901
  69. 304728 2012 441901
  70. 304730 2008 441901
  71. 304731 2008 441901
  72. 304744 2008 441901
  73. 304744 2011 441901
  74. 304744 2012 441901
  75. 304750 2008 441901
  76. 304750 2011 441901
  77. 304750 2012 441901
  78. 304754 2008 441901
  79. 304754 2011 441901
  80. 304754 2012 441901
  81. 304755 2008 441901
  82. 304783 2008 441901
  83. 304783 2011 441901
  84. 304783 2012 441901
  85. 304791 2008 441901
  86. 304791 2011 441901
  87. 304791 2012 441901
  88. 304794 2008 441901
  89. 304794 2011 441901
  90. 304794 2012 441901
  91. 304799 2008 441901
  92. 304799 2011 441901
  93. 304799 2012 441901
  94. 304806 2008 441901
  95. 1104515 2008 441901
  96. 1104515 2011 441901
  97. 1104515 2012 441901
  98. 304823 2008 441901
  99. 304832 2008 441901
  100. 304832 2012 441901
  101. 304857 2008 441901
  102. 304857 2011 441901
  103. 304857 2012 441901
  104. 304862 2008 441901
  105. end
复制代码

[/code]

板凳
经济学小小白 发表于 2019-10-19 22:33:26
刚刚截取的数据有问题,下面这个才是对的
  1. [CODE]
  2. * Example generated by -dataex-. To install: ssc install dataex
  3. clear
  4. input float(panelid year) long dqdm
  5. 353915 2001 441900
  6. 353915 2002 441900
  7. 353915 2003 441900
  8. 353915 2005 441900
  9. 353915 2006 441900
  10. 353915 2007 441904
  11. 353915 2008 441901
  12. 353915 2009 441900
  13. 353915 2010 441904
  14. 353915 2011 441901
  15. 353915 2012 441901
  16. 395305 2005 441900
  17. 395305 2006 441900
  18. 395305 2007 441925
  19. 395305 2008 441901
  20. 395305 2010 441925
  21. 441892 2012 441901
  22. 441892 2013 441900
  23. 441895 2012 441901
  24. 441895 2013 441900
  25. 441906 2011 441901
  26. 441906 2012 441901
  27. 441906 2013 441900
  28. 441928 2012 441901
  29. 441928 2013 441900
  30. end
复制代码

[/code]

报纸
经济学小小白 发表于 2019-10-19 22:34:28
经济学小小白 发表于 2019-10-19 22:33
刚刚截取的数据有问题,下面这个才是对的

[/code]
这个是我截取的部分数据,请大家帮我检查下代码哪里有错呀,感谢!

地板
经济学小小白 发表于 2019-10-20 07:54:45 来自手机
自己顶一下

7
黃河泉 在职认证  发表于 2019-10-20 08:04:17
请问你的目的是什么?看不太懂你的问题,请用资料说明一下!

8
经济学小小白 发表于 2019-10-20 09:42:07
黃河泉 发表于 2019-10-20 08:04
请问你的目的是什么?看不太懂你的问题,请用资料说明一下!
  1. use dqdm_error.dta,clear
  2. /*打开地区代码错误的文件dqdm_error.dta,这份文件是中国工业企业数据库中行政区划码
  3. 错误的数据,也就是在代码库里找不到这个代码,可能是由于企业登记的时候写错,或者其
  4. 他原因导致的*/
  5. levelsof dqdm //将错误的地区代码变量dqdm储存到宏变量r(levels)里
  6. use industrynew.dta,clear //打开中国工业企业数据库
  7. sort panelid year //按照公司id和year排序
  8. bys panelid: gen n=_n //按照公司id分组定义变量n为公司id依次出现的序列号
  9. order panelid year n dqdm //变量按照panelid year n dqdm排序
  10. foreach code in `r(levels)' { //调用地区代码变量dqdm的局部宏`r(levels)'
  11.         display in red "`code'"
  12.         levelsof n if dqdm==`code' //将相应地区代码dqdm对应的序列号n放在局部宏里
  13.         foreach v in `r(levels)' { //调用序列号n的局部宏
  14.                 display in yellow "`v'"
  15.                 if (panelid[`v']==panelid[`v'-1] & ///
  16.                 dqdm[`v'-1]~=`code') {
  17.                         replace dqdm=dqdm[`v'-1] in `v'
  18.                                 }
  19.                                 /*对于某个错误的dqdm,如果该dqdm同一行的panelid与上一行的panelid
  20.                                 相同,并且上一行的panelid不等于这个错误的dqdm,则将该行所在的地
  21.                                 区代码替换成上一行的地区代码dqdm*/
  22.                 if (panelid[`v']==panelid[`v'+1] & ///
  23.                 dqdm[`v'+1]~=`code') {
  24.                         replace dqdm=dqdm[`v'+1] in `v'
  25.                 }
  26.                                 /*对于某个错误的dqdm,如果该dqdm同一行的panelid与下一行的panelid
  27.                                 相同,并且下一行的panelid不等于这个错误的dqdm,则将该行所在的地
  28.                                 区代码替换成下一行的地区代码dqdm*/
  29.                 if (panelid[`v']==panelid[`v'-2] & ///
  30.                 dqdm[`v'-2]~=`code') {
  31.                         replace dqdm=dqdm[`v'-2] in `v'
  32.                 }
  33.                                 /*对于某个错误的dqdm,如果该dqdm同一行的panelid与上两行的panelid
  34.                                 相同,并且上两行的panelid不等于这个错误的dqdm,则将该行所在的地
  35.                                 区代码替换成上两行的地区代码dqdm*/
  36.                 if (panelid[`v']==panelid[`v'+2] & ///
  37.                 dqdm[`v'+2]~=`code') {
  38.                         replace dqdm=dqdm[`v'+2] in `v'
  39.                 }
  40.                                 /*与上类似*/
  41.                 if (panelid[`v']==panelid[`v'-3] & ///
  42.                 dqdm[`v'-3]~=`code') {
  43.                         replace dqdm=dqdm[`v'-3] in `v'
  44.                 }
  45.                                 /*与上类似*/
  46.                 if (panelid[`v']==panelid[`v'+3] & ///
  47.                 dqdm[`v'+3]~=`code') {
  48.                         replace dqdm=dqdm[`v'+3] in `v'
  49.                 }
  50.                                 /*同上类似*/
  51.         }
  52. }
复制代码
黄老师您好。我给上面的代码都加了注释。 就是我执行的时候都是no real changes。我的目的就是想把地区代码改成正确的代码库里有的代码

但是我刚刚用我截取的部分数据,使用下面的代码,是可以顺利执行的,有change的
(由于我截取的是工业企业数据库的部分内容,所以上面代码的1-11行就不用执行了。也可能错误就是出在在1-11行之间)
  1. levelsof n if dqdm==441901
  2. foreach v in `r(levels)' {
  3.         display in yellow "`v'"
  4.         if (panelid[`v']==panelid[`v'-1] & ///
  5.                 dqdm[`v'-1]~=441901) {
  6.                 replace dqdm=dqdm[`v'-1] in `v'
  7.         }
  8.     if (panelid[`v']==panelid[`v'+1] & ///
  9.                 dqdm[`v'+1]~=441901) {
  10.         replace dqdm=dqdm[`v'+1] in `v'
  11.         }
  12.     if (panelid[`v']==panelid[`v'-2] & ///
  13.         dqdm[`v'-2]~=441901) {
  14.         replace dqdm=dqdm[`v'-2] in `v'
  15.         }
  16.     if (panelid[`v']==panelid[`v'+2] & ///
  17.                 dqdm[`v'+2]~=441901) {
  18.                 replace dqdm=dqdm[`v'+2] in `v'
  19.         }
  20.     if (panelid[`v']==panelid[`v'-3] & ///
  21.                 dqdm[`v'-3]~=441901) {
  22.                 replace dqdm=dqdm[`v'-3] in `v'
  23.                 }
  24.     if (panelid[`v']==panelid[`v'+3] & ///
  25.                 dqdm[`v'+3]~=441901) {
  26.                 replace dqdm=dqdm[`v'+3] in `v'
  27.                 }
  28. }
复制代码

9
黃河泉 在职认证  发表于 2019-10-20 09:45:35
经济学小小白 发表于 2019-10-20 09:42
黄老师您好。我给上面的代码都加了注释。 就是我执行的时候都是no real changes。我的目的就是想把地区代 ...
老实说,我对你的程序没太大兴趣 (我一看就头昏),我再想若我了解问题,有无其它较简单之程序可以达成目标!

10
经济学小小白 发表于 2019-10-20 10:15:06
黃河泉 发表于 2019-10-20 09:45
老实说,我对你的程序没太大兴趣 (我一看就头昏),我再想若我了解问题,有无其它较简单之程序可以达成目标 ...
嗯,我换了一个方法是可以的。但有另一个问题,levelsof时显示macro substitution results in line that is too long, 只能分部分执行吗?有别的解决方法吗?
哈哈 确实看着头昏,我自己也常常这样。哈哈哈  还是感谢黄老师得热心肠

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jltj
拉您入交流群
GMT+8, 2025-12-5 14:01