在R中创建SpatialPointsDataFrame时保留缺失坐标的方法
解决思路
这个问题我之前也碰到过,sp包的SpatialPointsDataFrame确实不允许坐标里有NA值——它要求所有空间点都必须是有效的地理坐标,所以直接创建会触发NA values in coordinates的错误。不过有两种可行的解决思路,看你更倾向用哪种工具:
方法一:使用sf包(推荐)
sf是现在R生态里更现代、更灵活的空间数据处理包,它原生支持空几何(NA),可以完整保留所有行的数据,包括坐标缺失的记录,后续重投影、插值等操作也能无缝进行。
具体代码示例
# 先安装sf包(如果还没装的话) install.packages("sf") library(sf) # 你的原始数据 mov.data <- data.frame(x = c(-49.8427, -49.85003, NA, -49.84685), y = c(-21.30366, -21.29498, NA, -21.2944), time = 1:4, ID = 1) # 转换为sf对象,指定原始数据的坐标系(这里假设是WGS84,即EPSG:4326) mov.sf <- st_as_sf(mov.data, coords = c("x", "y"), crs = 4326) # 查看结果,第三行的geometry会显示为NA,完整保留了所有记录 print(mov.sf) # 重投影示例(比如转到UTM投影,对应南纬21度附近用EPSG:32722) mov.sf_reproj <- st_transform(mov.sf, crs = 32722) print(mov.sf_reproj)
用这个方法,坐标缺失的行不会被丢弃,后续你做插值的时候,直接基于这个sf对象操作即可,非常方便。
方法二:拆分数据后用sp包处理
如果你一定要坚持用sp包,那只能先把数据拆分成有有效坐标的记录和含NA坐标的记录,分别处理后再合并:
具体代码示例
library(sp) # 拆分数据:筛选出坐标完整的行和含NA的行 mov.data_valid <- mov.data[complete.cases(mov.data[, 1:2]), ] mov.data_na <- mov.data[!complete.cases(mov.data[, 1:2]), ] # 用有效坐标创建SpatialPointsDataFrame,指定原始坐标系 mov.spdata <- SpatialPointsDataFrame( coords = mov.data_valid[, 1:2], data = mov.data_valid[, 3:4], proj4string = CRS("+proj=longlat +datum=WGS84 +no_defs") ) # 执行重投影 mov.spdata_reproj <- spTransform( mov.spdata, CRS("+proj=utm +zone=22 +south +datum=WGS84 +units=m +no_defs") ) # 后续合并数据:把重投影后的坐标转回数据框,再和含NA的行合并 mov.spdata_reproj_df <- as.data.frame(mov.spdata_reproj) colnames(mov.spdata_reproj_df)[1:2] <- c("x_reproj", "y_reproj") mov.data_final <- merge(mov.data, mov.spdata_reproj_df, by = c("time", "ID"), all.x = TRUE) print(mov.data_final)
不过这种方法比较繁琐,需要手动拆分和合并,而且后续空间操作只能针对有效坐标的部分,不如sf包灵活。
内容的提问来源于stack exchange,提问作者bniebuhr
相关产品推荐
相关产品推荐

