楼主: swufer1998
1643 16

[编程问题求助] 求助stata forvalue循环的问题 [推广有奖]

  • 0关注
  • 0粉丝

高中生

37%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
6.8312
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
118 点
帖子
8
精华
0
在线时间
46 小时
注册时间
2021-11-10
最后登录
2022-12-3

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
大家好!现在我在处理数据的时候,需要对一列数据(大概有八千多个数据)进行处理,计算两个求和符号相乘的这一类循环。我用计算式给展开以后就是一个n*n的数据。
我具体的目的就是想要:比如假设这一列数据的变量标题名为收入,如果把第一行数据命名为x1,第二行数据为x2,以此类推到xn(其中n就是样本数),现在想要计算|x2-x1|+|x3-x1|+|x4-x1|……|xn-x1|     +|x3-x2|+|x4-x2|+……|xn-x2|+……     +|xn-xn-1|这样的数据,主要是不太清楚如何用循环来计算这样两两相减的数据。麻烦大家帮忙看一看,提提建议吧!!感激不尽!
二维码

扫码加我 拉你入群

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

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

关键词:forvalue 求助stata Stata value alue stata 经济

沙发
zdlspace 学生认证  发表于 2022-5-5 12:07:44 |只看作者 |坛友微信交流群
  1. clear
  2. range x -10 10 21

  3. forvalues i=1/20{
  4.         gen y`i'=.
  5.         replace y`i'=abs(x-x[`i']) if _n>`i'
  6.                
  7. }
  8. egen sum=rowtotal(y*)
  9. egen wanted=total(sum)
  10. drop y* sum
复制代码

使用道具

藤椅
zdlspace 学生认证  发表于 2022-5-5 12:13:23 |只看作者 |坛友微信交流群
  1. clear
  2. range x -10 10 21

  3. forvalues i=1/20{
  4.         gen y`i'=.
  5.         replace y`i'=abs(x-x[`i']) if _n>`i'
  6.         egen sum`i'=total(y`i')
  7. }
  8. egen wanted=rowtotal(sum*)
  9. drop y* sum*
复制代码

使用道具

板凳
zdlspace 学生认证  发表于 2022-5-5 12:18:53 |只看作者 |坛友微信交流群
  1. clear
  2. range x -10 10 21
  3. local n=_N-1
  4. forvalues i=1/`n' {
  5.         gen y`i'=.
  6.         replace y`i'=abs(x-x[`i']) if _n>`i'
  7.         egen sum`i'=total(y`i')
  8. }
  9. egen wanted=rowtotal(sum*)
  10. drop y* sum*
复制代码

使用道具

报纸
zdlspace 学生认证  发表于 2022-5-5 12:53:59 |只看作者 |坛友微信交流群

生成太多中间变量的话,会占用大量内存,最好还是用临时变量tempvar储存。

  1. clear
  2. set maxvar 50000
  3. range x -5000 5000 10001
  4. local n=_N-1
  5. gen wanted=0
  6. forvalues i=1/`n' {
  7.         tempvar y`i' sum`i'
  8.         gen `y`i''=abs(x-x[`i']) if _n>`i'
  9.         egen `sum`i''=total(`y`i'')
  10.         replace wanted=wanted+`sum`i''
  11. }
复制代码

使用道具

地板
swufer1998 发表于 2022-5-5 14:01:28 |只看作者 |坛友微信交流群
zdlspace 发表于 2022-5-5 12:53
生成太多中间变量的话,会占用大量内存,最好还是用临时变量tempvar储存。
gen simple_num = 8585
gen s1=0
forvalues i=1/8585{
forvalues j=1/8585{
replace s1=s1+abs(fincome1_per[`i']-fincome1_per[`j'])
}
}
我现在是用的两个循环来计算的,但是从中午就开始运行跑到现在都还没跑完!这种情况还有什么能够优化的吗?速度慢的简直让人哭了

使用道具

7
zdlspace 学生认证  发表于 2022-5-5 14:12:15 |只看作者 |坛友微信交流群
swufer1998 发表于 2022-5-5 14:01
gen simple_num = 8585
gen s1=0
forvalues i=1/8585{
我不是给你写了代码吗?

使用道具

8
swufer1998 发表于 2022-5-5 14:39:22 |只看作者 |坛友微信交流群
zdlspace 发表于 2022-5-5 14:12
我不是给你写了代码吗?
我试一下哈,谢谢啦

使用道具

9
zdlspace 学生认证  发表于 2022-5-5 14:51:58 |只看作者 |坛友微信交流群
swufer1998 发表于 2022-5-5 14:39
我试一下哈,谢谢啦
你这代码要跑7370万次,当然慢了,估计也跑不动啊

使用道具

10
zdlspace 学生认证  发表于 2022-5-5 14:54:19 |只看作者 |坛友微信交流群
swufer1998 发表于 2022-5-5 14:39
我试一下哈,谢谢啦
如果跑一次0.1秒,那也得跑三个月才能跑完

使用道具

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

本版微信群
加好友,备注jltj
拉您入交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-5-18 02:35