【发布时间】:2020-06-17 15:34:24
【问题描述】:
我对 R 很陌生,并且正在从事一个项目,我想在该项目中绘制纽约的热图,绘制不同出租车区的出租车/优步乘坐的接送地点。 我有一个包含 98k 行坐标的数据集,定义了纽约市 263 个不同的出租车区。此外,我有一个 df,其中包含 2010 年 7 月以来的所有取货地点,大约有 1450 万个地点。我想检查哪个位置位于哪个 Taxizone 中,并将每个 Taxizone 中开始的行程数相加,以将其绘制成热图。 这是我目前正在处理的代码,但列“TripsCountPerId”没有增加,我认为循环需要很长时间才能处理 1500 万行。point.in.polygon 函数来自 sp 包。可能还有其他一些功能在做类似的事情,我愿意使用这些。
for (row in 1:nrow(tlc1007)) {
point.x = tlc1007[row,"latPu"]
point.y = tlc1007[row, "longPu"]
for (i in 1:nrow(ZoneList)){
if (point.in.polygon(point.x,point.y,as.numeric(unlist(ZoneList[i,"lat"][[1]])),as.numeric(unlist(ZoneList[i,"long"][[1]])))){
ZoneList$TripsCountPerId[i] <- ZoneList$TripsCountPerId[i] +1
}
if (i%%100000==0){
print(paste(i," rows checked"))
}
}
}
tlc1007 是包含 2010 年 7 月纽约市行程的数据框,ZoneList 包含每个 Taxizone 的坐标。 我创建了 TripsCountPerId 列来获取每个 Taxizone 的行程总和,因为从这一点开始我可以更轻松地绘制地图。
为了您的理解,我尝试构建一个略有不同的简单示例:
library(sp)
library(dplyr)
lat <- c(0,2)
long <- c(0,2)
square <- as.data.frame(cbind(lat,long))
point1 <- c(1,1)
point2 <- c(1,3)
points <- as.data.frame(rbind(point1,point2)) %>%
rename("lat"="V1","long"="V2")
for (row in 1:2) {
point.x = points[row,"lat"]
point.y = points[row, "long"]
for (i in 1:2){
if (point.in.polygon(point.x,point.y, square$lat[i],square$long[i])){
print("TRUE")
} else {
print("FALSE")
}
}
【问题讨论】:
-
将
i切换到外部循环并计算as.numeric(unlist(ZoneList[i,"lat"][[1]]))(例如,因为它们似乎只依赖于 i 和外部数据)每 i 一次(现在限制为 ~263)可能会降低实际C 成本。当然,这并没有解决更大的复杂性,甚至没有解决“原始问题”。 -
您可能只需要遍历区域,而不需要遍历数据行。请说明
point.in.polygon来自哪个包。 -
嗨@Axeman,我在我的问题中编辑了它。它来自 sp 包,但我愿意使用不同的包