楼主: 我那些年华
3127 6

[实际应用] R for循环代码优化 [推广有奖]

  • 0关注
  • 0粉丝

本科生

29%

还不是VIP/贵宾

-

威望
0
论坛币
1 个
通用积分
4.5000
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
2996 点
帖子
28
精华
0
在线时间
133 小时
注册时间
2014-10-13
最后登录
2024-5-22

楼主
我那些年华 发表于 2018-3-23 17:13:43 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
请教各位大神:
distance <- c()
for (i in 1:nrow(cz_bts_3g))
{
  for (j in 1:nrow(cz_yyt_wz))
  {
    dist <- round(distm(cz_bts_3g[i,9:10],cz_yyt_wz[j,4:5],fun = distVincentyEllipsoid),0)
    b <- data.frame(cz_bts_3g[i,1:10],cz_yyt_wz[j,2],dist)
    distance <- rbind(distance,b)
  }
}
write.csv(distance,"C:/Users/hhx/Desktop/jz_4g_alter/cz_3g_yyt_dist.csv")
现在有cz_bts_3g,这是基站的表,包含经纬度信息,cz_yyt_wz这个是营业厅的表,也包含经纬度信息,我想操作的就是求出每一个基站和每一个营业厅之间的距离,然后再求出距离这个基站最近的营业厅是哪个,以及他们的距离。我写了一个for循环,但是数据量大的话(30000*500,也就是1500万条数据),根本跑不动,所有想请教各位大神,有没有快速的方法。 这个是基站数据 这个是营业厅数据

跪求各位大神。。。。。

二维码

扫码加我 拉你入群

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

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

关键词:统计

沙发
cheetahfly 在职认证  发表于 2018-3-23 22:55:17
“循环”表示:这个锅不背。
最大的问题在:distance <- rbind(distance,b),要为变量分配1500万次地址,简直是灾难了。
其次是: b <- data.frame(cz_bts_3g[i,1:10],cz_yyt_wz[j,2],dist),直接把最小的dist和对应ID记录下来不行吗?

藤椅
jameschin007 发表于 2018-3-25 00:32:26
你肯定不能上来就做笛卡尔积啊。
你这个数据,基站和营业厅都有地区信息。应该可以在一个地区内做配对吧。 即每个安庆地区的基站和安庆地区的营业厅一个个计算距离。
这样你的数据计算量会大量减少。

另外一个算法,给你一个思路,
假设一共有m个营业厅。  
1.先给定一个半径 l (根据经纬度), 逐个营业厅计算以营业厅为原点 半径l范围内,哪些基站落入该圈内。
如落入了m1 圈的基站,且没有落入其他圈的,则必然是m1营业厅最近, 记录下最近的营业厅ID。 如同时落入了m1, m2, m5 三个营业厅的圈子,需要比较距离后,记录下最近的营业厅ID。
2. 剔除掉已经记录最近营业厅Id的基站点, 按步长x 增加半径 l+x,逐个营业厅画圈,重复第一步。
3.直到所有基站点被标注营业厅ID

已有 1 人评分论坛币 收起 理由
cheetahfly + 10 热心帮助其他会员

总评分: 论坛币 + 10   查看全部评分

板凳
我那些年华 发表于 2018-3-26 09:04:27
cheetahfly 发表于 2018-3-23 22:55
“循环”表示:这个锅不背。
最大的问题在:distance
请大神指导啊,最大的问题在:distance <- rbind(distance,b),这个怎么修改呢?直接把最小的dist和对应id记录下来怎么操作啊?小白一个

报纸
cheetahfly 在职认证  发表于 2018-3-26 09:24:26
我那些年华 发表于 2018-3-26 09:04
请大神指导啊,最大的问题在:distance
先定义好"distance"的长度,然后每个循环中给
  1. distance[i]
复制代码
赋值,在你的案例中,应该可以快90%以上。

地板
我那些年华 发表于 2018-3-26 09:59:38
cheetahfly 发表于 2018-3-26 09:24
先定义好"distance"的长度,然后每个循环中给赋值,在你的案例中,应该可以快90%以上。
假设基站数量300个,营业厅100个,您的意思是,distance的长度是300*100,(那distance是向量?) 不知道理解的对不对

7
我那些年华 发表于 2018-3-26 10:14:49
cheetahfly 发表于 2018-3-26 09:24
先定义好"distance"的长度,然后每个循环中给赋值,在你的案例中,应该可以快90%以上。
假设有300个基站,100个营业厅,按照您的意思是distance的长度是300*100(那distance是向量?),还有赋值的时候直接赋值distance,i我用的是i in 1:300这样肯定不行吧?在嵌套一层?

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-2-8 11:48