全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 R语言论坛
3128 6
2018-03-23
请教各位大神:
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万条数据),根本跑不动,所有想请教各位大神,有没有快速的方法。 这个是基站数据 这个是营业厅数据

跪求各位大神。。。。。

二维码

扫码加我 拉你入群

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

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

全部回复
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记录下来不行吗?
二维码

扫码加我 拉你入群

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

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

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

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

二维码

扫码加我 拉你入群

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

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

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

扫码加我 拉你入群

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

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

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

扫码加我 拉你入群

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

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

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

扫码加我 拉你入群

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

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

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群