楼主: azrex
2595 21

[编程问题求助] stata 中是否存在判断语句? [推广有奖]

  • 1关注
  • 1粉丝

硕士生

58%

还不是VIP/贵宾

-

威望
0
论坛币
555 个
通用积分
35.7820
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
489 点
帖子
32
精华
0
在线时间
313 小时
注册时间
2016-11-16
最后登录
2025-10-25

楼主
azrex 发表于 2021-8-1 19:21:15 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
   最近在处理数据时,发现在同时多选变量改变format时(如 format _all %20s )选择所有变量改变格式时会报错:data中同时包含 str 与 byte 类变量时,format  _all 语句会由于变量存储形式不同而报错,想请教一下是否有可以判断变量是数值还是字符型的命令吗,类似matlab 里的is 函数?或 者是否有命令可以选择全部string类型的变量而非 所有变量(_all)?
二维码

扫码加我 拉你入群

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

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

关键词:Stata tata format MATLAB string

回帖推荐

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

沙发
zdlspace 学生认证  发表于 2021-8-2 01:49:04
简单循环一下即可
  1. foreach v of varlist *{
  2.         cap format `v' %20s
  3. }
复制代码

藤椅
azrex 发表于 2021-8-2 14:10:39
zdlspace 发表于 2021-8-2 01:49
简单循环一下即可
非常感谢,这是一个办法!我在想有没有更好的办法,因为在变量更多的情况下系统会变得很慢,不过还是非常感谢!

板凳
zdlspace 学生认证  发表于 2021-8-2 14:32:55
azrex 发表于 2021-8-2 14:10
非常感谢,这是一个办法!我在想有没有更好的办法,因为在变量更多的情况下系统会变得很慢,不过还是非常 ...
我很好奇你有多少个变量?怎么会很慢呢?我刚试了一下10000个变量,10000个观测值,只花了0.64秒,一般也不会超过10000个变量了吧
  1. clear
  2. set maxvar 20000
  3. set obs 10000
  4. forval i=1/10000{
  5.         gen str10 v`i'="aaaa"
  6. }

  7. timer clear
  8. timer on 1
  9. foreach v of varlist *{
  10.         cap format `v' %20s
  11. }
  12. timer off 1
  13. timer list

  14. 1:      0.65 /        1 =       0.6480
复制代码

报纸
zdlspace 学生认证  发表于 2021-8-2 14:34:53
azrex 发表于 2021-8-2 14:10
非常感谢,这是一个办法!我在想有没有更好的办法,因为在变量更多的情况下系统会变得很慢,不过还是非常 ...
0.6秒还慢吗?1秒都不到呀,很好奇你是什么样的数据,居然会很慢,难道有几万个变量吗

地板
azrex 发表于 2021-8-3 08:48:23
zdlspace 发表于 2021-8-2 14:34
0.6秒还慢吗?1秒都不到呀,很好奇你是什么样的数据,居然会很慢,难道有几万个变量吗
因为写程序的话感觉用循环中用cap会对时间产生影响,这些影响在observation过多的情况下会放大,cap虽然会解决不报错的问题并且让程序继续进行,但是程序报错的时间还是客观存在的,所以在处理大型数据的时候我希望还是能找到减少系统时间的程序(当然在如果的可能下,这个问题可能暂时没办法解决)。我的数据是observation多而不是变量多,几百万的obs我觉得每变更一次就会变得时间很长,而如果报错的话可能对系统计算与优化有影响,很简单的例子,您上述的例子里如果用 format _all %20s 基本不费时间(0.001s,可能是系统误差导致,也有可能是循环导致的),而用循环的话我这边大概是0.2s左右,还是有些差距的。

7
zdlspace 学生认证  发表于 2021-8-5 14:48:45
azrex 发表于 2021-8-3 08:48
因为写程序的话感觉用循环中用cap会对时间产生影响,这些影响在observation过多的情况下会放大,cap虽然会 ...
  1. *你说的有道理,如果变量不多,而观测值多的时候,确实以上方案有点慢,我再给一种更快的方案吧。
  2. clear
  3. set maxvar 20000
  4. set obs 2000000
  5. forval i=1/10{
  6.         gen str20 v`i'="aaaa"
  7. }

  8. qui ds,has(type string)
  9. timer clear
  10. timer on 1
  11. format `r(varlist)' %20s
  12. timer off 1
  13. timer list
  14. qui ds,has(type string)
  15. //200万个观测值,20个变量,只花了0.0000秒,0秒完成,太佩服我自己啦!别忘了,奖励论坛币哦!
复制代码
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
azrex + 5 + 1 + 1 + 1 精彩帖子

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

8
zdlspace 学生认证  发表于 2021-8-5 15:03:38
  1. *你说的有道理,如果变量不多,而观测值多的时候,确实以上方案有点慢,我再给一种更快的方案吧。

  2. clear
  3. set maxvar 20000
  4. set obs 2000000
  5. forval i=1/10{
  6.         gen str20 v`i'="aaaa"
  7. }

  8. qui ds,has(type string)
  9. timer clear
  10. timer on 1
  11. format `r(varlist)' %20s
  12. timer off 1
  13. timer list
  14. qui ds,has(type string)
  15. //200万个观测值,20个变量,只花了0.0000秒,0秒完成,太佩服我自己啦!别忘了,奖励论坛币哦!
复制代码

9
zdlspace 学生认证  发表于 2021-8-5 15:05:57
上面给出的两种方案,第一种适合变量多,观测至少的情况;第二种适合变量少,观测值多的情况。

10
zdlspace 学生认证  发表于 2021-8-5 15:27:27
再提供一种方案:
  1. clear
  2. set maxvar 20000
  3. set obs 2000000
  4. forval i=1/20{
  5.         gen str20 v`i'="aaaa"
  6. }

  7. timer clear
  8. timer on 1
  9. foreach v of varlist *{
  10.         cap confirm string variable `v'
  11.                 if !_rc{
  12.                         format `v' %20s
  13.                 }
  14.                        
  15. }
  16. timer off 1
  17. timer list

  18. 1:      0.01 /        1 =       0.0050
复制代码


速度也挺快,200万个观测值,20个变量,用时0.005秒
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
azrex + 5 + 1 + 1 + 1 精彩帖子

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

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

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