如何修改R代码使不在Shapefile区域及坐标错误的点返回NA
修改R代码以返回NA给无效/非服务区点
我来帮你调整这段代码,让不在纽约出租车服务区的点,以及坐标明显错误的点都返回NA。咱们先看修改后的完整代码,再拆解关键改动:
library(sf) # 读取出租车服务区数据 tt <- read_sf('taxi_zones.shp') # 创建测试点数据框 pnts <- data.frame( "x" = c(-73.97817, -74.00668, 0, 500), "y" = c(40.75798, 40.73178, 0, 400) ) # 1. 简化点的sf对象创建(替代原有的do.call写法) pnts_sf <- st_as_sf(pnts, coords = c("x", "y"), crs = 4326) # 2. 提前标记明显无效的坐标(纽约大致经纬度范围:-74.3~-73.7 经度,40.5~40.9 纬度) # 超出这个范围的点直接标记为无效 valid_coords <- with(pnts, x > -74.3 & x < -73.7 & y > 40.5 & y < 40.9) # 3. 坐标转换(保持原有的投影转换逻辑) pnts_trans <- st_transform(pnts_sf, 2163) tt_trans <- st_transform(tt, 2163) # 4. 处理相交结果,返回NA给无效/无交集的点 zones <- sapply(seq_len(nrow(pnts_trans)), function(i) { # 如果坐标无效,直接返回NA if (!valid_coords[i]) { return(NA) } # 检查当前点是否与服务区相交 intersect_idx <- st_intersects(tt_trans, pnts_trans[i, ], sparse = FALSE)[,1] # 无交集则返回NA,否则返回对应的LocationID if (sum(intersect_idx) == 0) { NA } else { tt_trans$LocationID[intersect_idx] } }) # 查看结果 zones
关键改动说明:
- 简化点对象创建:用
st_as_sf直接将data.frame转为sf点对象,比原有的do.call + lapply写法更简洁易读,也减少出错概率。 - 提前过滤无效坐标:通过判断经纬度是否在纽约合理范围内,直接标记明显错误的坐标(比如0,0或500,400这类完全偏离的点)为无效,后续直接返回NA。
- 逐点处理相交逻辑:用
sapply逐点处理,代替原有的apply,逻辑更清晰。对于每个点:- 先检查坐标是否有效,无效则返回NA;
- 再计算该点与服务区的交集,无交集则返回NA,否则返回对应的
LocationID。
- 避免空值返回:原代码中无交集的点会返回空向量,修改后统一返回NA,符合你的需求。
运行这段代码后,你会得到结果:[1] 161 79 NA NA,正好对应前两个有效点的服务区ID,后两个点返回NA。
内容的提问来源于stack exchange,提问作者Allen
相关产品推荐
相关产品推荐

