楼主: diannaoasd
1406 6

[编程问题求助] 求一段stata代码,十分感谢 [推广有奖]

  • 8关注
  • 7粉丝

已卖:1334份资源

讲师

32%

还不是VIP/贵宾

-

威望
0
论坛币
79917 个
通用积分
175.0726
学术水平
9 点
热心指数
5 点
信用等级
5 点
经验
5816 点
帖子
180
精华
0
在线时间
621 小时
注册时间
2010-12-6
最后登录
2025-12-25

楼主
diannaoasd 发表于 2019-12-11 15:10:52 |AI写论文
100论坛币
两两距离提问.png
如图,前四列是已知变量,第一列城市ID,第二列纬度,第三列经度,第四列哑变量(Y),求第五列wanted。
问题:10个城市中,只要与哑变量为“1”城市的距离小于10km,那么wanted=1,否则wanted=0
我知道stata有一个命令globdist可以计算两个 坐标 的距离,
并且,levelsof array, local(var) sep(|) clean,可以生成一个类似于(var1|var2|var3|var4|var5|var6|var7|)的数组(array)
疑难1:首先想到做一个循环,可不知道如何在循环里,让stata把Y=1的城市单挑出来。
疑难2:我是将近100万条数据,大约十几万条城市Y=1,globdist会把计算出来的距离生产一个新变量,我循环中,stata放不下100多万个变量。疑难3:如何能返回是具体与哪个城市距离小于10km?
高手有没有直接的命令?非常感谢!



数据dta见附件,我也用dataex输出了(不知道为什么到带着格式,所以附件也加了dta)。

  1. * Example generated by -dataex-. To install: ssc install dataex
  2. clear
  3. input byte cityid double(lat lon) int(Y wanted)
  4. 1 32.52 86.66 1 .
  5. 2 30.76  87.7 1 .
  6. 3 31.88  85.4 0 .
  7. 4 33.04 87.15 0 .
  8. 5 34.01 86.63 0 .
  9. 6 32.08  85.7 0 .
  10. 7 31.74 86.68 0 .
  11. 8 33.76 85.84 1 .
  12. 9 32.92 85.36 0 .
  13. 10 34.23 85.62 0 .
  14. end
复制代码



globdist示例.dta (3.87 KB)




沙发
震震果实 发表于 2019-12-11 15:10:53
  1.         gsort -Y       //存在三个城市为中心城市
  2.         gen id=_n      //id[1-3]为中心城市(对城市进行重新编码)
  3.         gen ct="附近10KM的城市:"
  4.        
  5.        
  6.         forvalues k = 1(1)3{

  7.                 local i = id[`k']

  8.                 local lat_n = lat[`k']

  9.                 local lon_n = lon[`k']

  10.                 globdist kmTo`i', lat0(`lat_n') lon0(`lon_n')
  11.                
  12.                 replace wanted=1 if kmTo`i'<10
  13.                
  14.                 gen s=`i'
  15.                
  16.                 tostring s,replace
  17.                
  18.                 replace ct=ct+s+"+" if kmTo`i'<10
  19.                
  20.                 drop s
  21.                
  22.                 drop kmTo`i'
  23.                 }
  24.        
  25.         ///仅需根据中心城市个数,修改循环次数即可       
复制代码
已有 2 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
diannaoasd + 5 + 2 + 2 + 2 精彩帖子
admin_kefu + 20 + 2 + 2 + 2 热心帮助其他会员

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

藤椅
diannaoasd 发表于 2019-12-13 09:13:05
我自己的顶一下,大佬有思路吗?

板凳
diannaoasd 发表于 2019-12-13 09:31:07
我发布的现金项目,有思路的大佬,欢迎接项目:
https://bbs.pinggu.org/prj/view/25169.html

报纸
美乐猫 学生认证  发表于 2019-12-13 11:33:36
据我的理解,怎么用stata做,我不太清楚,但如果可以使用GIS的话,我有两条思路。
第一条思路:你的这个题目可以分解为两部,一是计算两个城市之间的距离,就是OD分析,二是判断这个距离的大小,从而返回值。
第二条思路:在所有Y=1的点建立10km缓冲区,然后判断不同cityid是否落在缓冲区内,在wanted为1,否为0.
已有 1 人评分论坛币 学术水平 热心指数 收起 理由
admin_kefu + 20 + 2 + 2 精彩帖子

总评分: 论坛币 + 20  学术水平 + 2  热心指数 + 2   查看全部评分

地板
震震果实 发表于 2019-12-13 19:11:20 来自手机
跑100万条,确实挺费时间的。
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
diannaoasd + 5 + 2 + 2 + 2 感谢您的帮助,在给您评一次分

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

7
diannaoasd 发表于 2019-12-14 17:00:04
震震果实 发表于 2019-12-13 21:57
非常感谢您,我试试呢,今天看到提示了,但看到是昨天的提示,就忽略了,刚看到您提供了代码,非常感谢,我试试呢。

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

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