楼主: fugangxx
1823 18

[编程问题求助] stata 编程问题求助 [推广有奖]

  • 7关注
  • 15粉丝

已卖:5892份资源

学术权威

11%

还不是VIP/贵宾

-

威望
0
论坛币
155491 个
通用积分
9282.1547
学术水平
63 点
热心指数
132 点
信用等级
79 点
经验
3623 点
帖子
4006
精华
0
在线时间
4915 小时
注册时间
2013-6-18
最后登录
2026-1-21

楼主
fugangxx 在职认证  发表于 2021-8-13 11:59:27 |AI写论文
30论坛币
各位大侠,您好,我在stata应用过程中遇到了两个问题,现特向各位stata高手请教求助. dataex

----------------------- copy starting from the next line -----------------------
  1. * Example generated by -dataex-. For more info, type help dataex
  2. clear
  3. input str1 keys float group
  4. "a" 1
  5. "b" 1
  6. "b" 1
  7. "d" 1
  8. "g" 1
  9. "g" 1
  10. "h" 1
  11. "m" 1
  12. "a" 2
  13. "b" 2
  14. "b" 2
  15. "b" 2
  16. "c" 2
  17. "f" 2
  18. "g" 2
  19. "h" 2
  20. "m" 2
  21. "a" 3
  22. "b" 3
  23. "b" 3
  24. "b" 3
  25. "c" 3
  26. "c" 3
  27. "c" 3
  28. "d" 3
  29. "d" 3
  30. "m" 3
  31. "a" 4
  32. "b" 4
  33. "b" 4
  34. "b" 4
  35. "b" 4
  36. "b" 4
  37. "c" 4
  38. "d" 4
  39. "d" 4
  40. "m" 4
  41. end
复制代码

------------------ copy up to and including the previous line ------------------



问题1: 提取变量keys中的某特定值的序号并存储于暂元中,如m,在以上数据的序号分别是8,17,27,37,当然实际他们的分布没有特定的规律,每组有一个,但位置不固定,想将序号提取出来,然后应用于循环中。
set obs _n
levelsof obs if keys == "m", gen(num)
ret list
这种方法我用过了,想看看还有没有别的好方法

问题2:变量keys中的某特定值如b在各组中连续出现(注:一定要连续出现,如不连续出现则不计)的次数最大值,如b在第1、2、3、4组中分别出现了2,3,3,5次,最大值为5,需要提取这个最大值和存储于暂元中。
我用tabstat能求出连续值的个数列表,没能继续求结果,请各位大侠出手 帮助

以上两问题的各种解答方法(第一问我已经使用并呈现的方法除外)按方法计都奖励30积分,不同方法累积积分,如果相同方法则第一个提供者得到奖励。(注:用不同的命令属于不同的方法,用矩阵或者mata也是不同的方法,用不同的程序思路解决问题也属于不同的方法……但是如第一问中自己提供的方法,如有另外提供如下程序:set a =_n,levelsof a if keys == "m", gen(b),则属于同一种方法。请各位大侠积极出手相助。
谢谢大家,再次感谢!!!


最佳答案

zdlspace 查看完整内容

第一个问题你已经解决了我就不回答了。回答第二个问题,为了满足你的要求,我在group=4时加了一个不连续的b,让你看得更清楚些。
关键词:Stata tata including generated Starting

回帖推荐

zdlspace 发表于12楼  查看完整内容

你确定这代码行吗?是不是要检查一下哪里有问题?举个例子:结果似乎不对哦,最大应该是3,你的代码返回的是4

沙发
zdlspace 学生认证  发表于 2021-8-13 11:59:28
第一个问题你已经解决了我就不回答了。回答第二个问题,为了满足你的要求,我在group=4时加了一个不连续的b,让你看得更清楚些。
  1. * Example generated by -dataex-. For more info, type help dataex
  2. clear
  3. input str1 keys float group
  4. "a" 1
  5. "b" 1
  6. "b" 1
  7. "d" 1
  8. "g" 1
  9. "g" 1
  10. "h" 1
  11. "m" 1
  12. "a" 2
  13. "b" 2
  14. "b" 2
  15. "b" 2
  16. "c" 2
  17. "f" 2
  18. "g" 2
  19. "h" 2
  20. "m" 2
  21. "a" 3
  22. "b" 3
  23. "b" 3
  24. "b" 3
  25. "c" 3
  26. "c" 3
  27. "c" 3
  28. "d" 3
  29. "d" 3
  30. "m" 3
  31. "a" 4
  32. "b" 4
  33. "b" 4
  34. "b" 4
  35. "b" 4
  36. "b" 4
  37. "c" 4
  38. "b" 4
  39. "d" 4
  40. "m" 4
  41. end


  42. spell keys,by(group)
  43. gen d=_seq*_end if keys=="b"
  44. egen wanted=max(d)
  45. levelsof wanted

  46. 5
复制代码
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
Sunknownay + 3 + 3 + 3 热心帮助其他会员

总评分: 学术水平 + 3  热心指数 + 3  信用等级 + 3   查看全部评分

藤椅
pengxhan 发表于 2021-8-13 16:25:31
第二个也可以
bys group:egen count=count(keys) if keys=="b"
egen max=max(count)
local max=max

板凳
pengxhan 发表于 2021-8-13 16:41:46
第二个只能针对你现有数据有效 还是楼上的正解
给个第一个的其他解法
gen id=_n
gen id2=id if keys=="m"
levelsof id2
dis r(levels)

报纸
zdlspace 学生认证  发表于 2021-8-13 16:41:49
pengxhan 发表于 2021-8-13 16:25
第二个也可以
bys group:egen count=count(keys) if keys=="b"
egen max=max(count)
这个代码不行哦,他要的是连续的b的个数最大值,举个例子:
  1. clear
  2. input str1 keys float group
  3. "a" 1
  4. "b" 1
  5. "b" 1
  6. "d" 1
  7. "g" 1
  8. "g" 1
  9. "h" 1
  10. "m" 1
  11. "a" 2
  12. "b" 2
  13. "b" 2
  14. "b" 2
  15. "c" 2
  16. "f" 2
  17. "g" 2
  18. "h" 2
  19. "m" 2
  20. "a" 3
  21. "b" 3
  22. "b" 3
  23. "b" 3
  24. "c" 3
  25. "c" 3
  26. "c" 3
  27. "d" 3
  28. "d" 3
  29. "m" 3
  30. "a" 4
  31. "b" 4
  32. "b" 4
  33. "f" 4
  34. "b" 4
  35. "b" 4
  36. "c" 4
  37. "b" 4
  38. "d" 4
  39. "m" 4
  40. end

  41. bys group:egen count=count(keys) if keys=="b"
  42. egen max=max(count)
  43. local max=max

  44. spell keys,by(group)
  45. gen d=_seq*_end if keys=="b"
  46. egen wanted=max(d)
  47. levelsof wanted

  48. drop _* d
  49. list

  50.      +-------------------------------------+
  51.      | keys   group   count   max   wanted |
  52.      |-------------------------------------|
  53.   1. |    a       1       .     5        3 |
  54.   2. |    b       1       2     5        3 |
  55.   3. |    b       1       2     5        3 |
  56.   4. |    d       1       .     5        3 |
  57.   5. |    g       1       .     5        3 |
  58.      |-------------------------------------|
  59.   6. |    g       1       .     5        3 |
  60.   7. |    h       1       .     5        3 |
  61.   8. |    m       1       .     5        3 |
  62.   9. |    a       2       .     5        3 |
  63. 10. |    b       2       3     5        3 |
  64.      |-------------------------------------|
  65. 11. |    b       2       3     5        3 |
  66. 12. |    b       2       3     5        3 |
  67. 13. |    c       2       .     5        3 |
  68. 14. |    f       2       .     5        3 |
  69. 15. |    g       2       .     5        3 |
  70.      |-------------------------------------|
  71. 16. |    h       2       .     5        3 |
  72. 17. |    m       2       .     5        3 |
  73. 18. |    a       3       .     5        3 |
  74. 19. |    b       3       3     5        3 |
  75. 20. |    b       3       3     5        3 |
  76.      |-------------------------------------|
  77. 21. |    b       3       3     5        3 |
  78. 22. |    c       3       .     5        3 |
  79. 23. |    c       3       .     5        3 |
  80. 24. |    c       3       .     5        3 |
  81. 25. |    d       3       .     5        3 |
  82.      |-------------------------------------|
  83. 26. |    d       3       .     5        3 |
  84. 27. |    m       3       .     5        3 |
  85. 28. |    a       4       .     5        3 |
  86. 29. |    b       4       5     5        3 |
  87. 30. |    b       4       5     5        3 |
  88.      |-------------------------------------|
  89. 31. |    f       4       .     5        3 |
  90. 32. |    b       4       5     5        3 |
  91. 33. |    b       4       5     5        3 |
  92. 34. |    c       4       .     5        3 |
  93. 35. |    b       4       5     5        3 |
  94.      |-------------------------------------|
  95. 36. |    d       4       .     5        3 |
  96. 37. |    m       4       .     5        3 |
  97.      +-------------------------------------+
复制代码
按照我的代码得到的是3,按你的代码得到的是5.他要求b一定要连续出现哦,如不连续则不计。

地板
fugangxx 在职认证  发表于 2021-8-13 17:10:51
谢谢楼主的回复:很好的思路,您提供的两种方法,
第一种方法:我改进如下
spell keys,by(group)
gen d=_seq*_end if keys=="b"
sum d
local max `r(max) '

第二种方法:有些小瑕疵,因为它没有识别是否为连续出现的b,连续的最大计数为5,而不是6,该方法把所组内所有的结果都计篱



7
fugangxx 在职认证  发表于 2021-8-13 17:18:03
楼上正解,第一种方法可行,第二种方法不是我想要的方法,但是我错给第二种方法点赞了

8
pengxhan 发表于 2021-8-13 17:28:44 来自手机
fugangxx 发表于 2021-8-13 11:59
各位大侠,您好,我在stata应用过程中遇到了两个问题,现特向各位stata高手请教求助. dataex

---------- ...
我说了呀,只针对他目前已经连续数据有效。

9
zdlspace 学生认证  发表于 2021-8-13 17:31:57
pengxhan 发表于 2021-8-13 17:28
我说了呀,只针对他目前已经连续数据有效。
嗯,我在你发那个帖子之前发出去的,在审核中,等你解释的时候,已经撤不回来了

10
pengxhan 发表于 2021-8-13 19:24:22
纯粹为了练习 我编写了下面命令可识别不连续 不用spell
bys group:egen seq=seq() if keys=="b"
egen  max=max(seq) if  seq[_n-1]!=.
levelsof  max
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
fugangxx + 5 + 5 + 5 + 5 精彩帖子

总评分: 论坛币 + 5  学术水平 + 5  热心指数 + 5  信用等级 + 5   查看全部评分

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

本版微信群
加好友,备注jltj
拉您入交流群
GMT+8, 2026-1-29 09:01