我正在尝试找到最有效的方式来解决R 中的以下难题,而必须使用嵌套 for
循环(嵌套for
循环将永远占用):
我们假设我们有2个数据框d_zone2
和stops
。他们的列中有三个:lat
,long
和zone,
,用于描述地图上某些点的位置,这些点分为不同的多边形。 zone
中的d_zone2
列全部初始化为NA
。现在,我想通过规则为zone
d_zone2
列中的每个元素分配正确的值:对于d_zone2
中的每对lat-lon,我分配{{1 zone
中的元素如果lat-lon对与stops
中的zone
元素对应,则stops
中的lat-lon对的欧几里德距离最小。
我想到的初始解决方案是根据d_zone2
以stops
为基础,以递增顺序排列数据框lat
,然后long
。然后,对于lat-lon
中的每对d_zone2
,我可以使用嵌套 for
循环遍历所有连续的lat-lon
对以确定我lat-lon
中的d_zone2
是。{代码如下:
for(i in 1:nrow(d_zone2)){
for(j in 1:nrow(stops)){
if(d_zone2$Lat[i] >= stops$Lat[j] && d_zone2$Long[i] >= stops$Lat[j] && d_zone2$Lat[i]<= stops$Lat[j+1] && d_zone2$Long[i] <= stops$Lat[j+1]){
d_zone2$X8[i] = stops$X8[j];
}
}
}
但是,我意识到这是不非常正确,因为d_zone2$X8[i]
可能属于stops$X8[j+1]
(因为lat-lon
可能更接近< / strong>与stops$X8[j+1]
相比stops$X8[j]
)。因此,我认为唯一有效的方法是在lat-lon
中找到哪个 stops
对提供最小欧几里德距离d_zone2
中的一对纬度。但我不知道如何在R中执行此操作而不使用嵌套 for()
循环。
第二种方法:另一种方法是利用下面zone.csv
文件中存储的多边形列表。现在,解决方案是选择lat-lon
和d_zone2
中的一对stops
落入的存储桶,然后只为stops$X8
分配区域编号特定lat-lon
对d_zone2
中的元素。
问题:有人可以使用上面演示的 Euclidean 或 2nd 方法帮助我解决这个难题吗?我想使用dplyr::select(dplyr::left_join(x = d_zone2, y = stops%>% select("Lat", "Long", X8), by = ...)
,但我不确定如何填写by=??
的真实条件
.RData file containing both data frames d_zone2 and stops. Warning: Quite large files!
答案 0 :(得分:2)
这需要大约15秒,因为我们首先过滤掉重复的点。这为embedding_layer1 = Embedding(len(word_index) + 1,
EMBEDDING_DIM,
weights=[embedding_matrix_1],
input_length=MAX_SEQUENCE_LENGTH,
trainable=False)
embedding_layer2 = Embedding(len(word_index) + 1,
EMBEDDING_DIM,
weights=[embedding_matrix_2],
input_length=MAX_SEQUENCE_LENGTH,
trainable=False)
model.add(embedding_layer1)
model.add(embedding_layer2)
留下了5457个独特点。对于它们中的每一个,我们计算到所有停靠点的距离并获得具有最小距离的停靠点的索引。之后,您可以通过停止ID将区域与所有19228939点匹配。
d_zone2