如何为列表中每个数据框生成并关联存储空间范围(terra包)
解决方法
首先你的代码存在两个关键问题:
extent()函数的参数顺序错误:terra包中extent()的正确参数顺序是**(xmin, xmax, ymin, ymax)**,也就是经度最小值、经度最大值、纬度最小值、纬度最大值,你之前的参数顺序完全颠倒了。- 函数逻辑里的变量对应错误:你把纬度的最值放到了经度参数位置,经度的最值放到了纬度参数位置。
另外,针对你的需求,lapply()是更合适的选择——因为你要处理的是列表中的每个数据框元素,而mutate()主要用于给单个数据框添加列,处理列表时需要结合额外工具,lapply()作为基础R的列表处理原生工具,更直接高效。
修正后的完整代码
library(terra) library(dplyr) # 构造示例数据 lat_1 <- c(23.2, 14.5, 28.6) lon_1 <- c(12.1, 8.5, 2.2) lat_2 <- c(89.3, 94.4, 72.3) lon_2 <- c(45.2, 47, 48.5) coords_1 <- data.frame(lon = lon_1, lat = lat_1) # 统一列名方便后续通用处理 coords_2 <- data.frame(lon = lon_2, lat = lat_2) list_coords <- list(coords_1, coords_2) # 修正后的生成空间范围函数 get_extent <- function(df) { min_lon <- floor(min(df$lon)) max_lon <- ceiling(max(df$lon)) min_lat <- floor(min(df$lat)) max_lat <- ceiling(max(df$lat)) # 按照xmin, xmax, ymin, ymax的正确顺序传入参数 extent(x = c(min_lon, max_lon, min_lat, max_lat)) } # 遍历列表,为每个数据框生成空间范围并关联存储 # 结果列表的每个元素是包含原数据框和对应空间范围的子列表 result_list <- lapply(list_coords, function(df) { list( raw_data = df, spatial_extent = get_extent(df) ) }) # 查看结果示例 # 第一个数据框对应的空间范围 result_list[[1]]$spatial_extent # 第二个数据框的原始数据 result_list[[2]]$raw_data
可选方案:给数据框直接添加extent列
如果你希望直接在原数据框中新增列存储空间范围,可修改lapply的处理逻辑:
result_list_with_col <- lapply(list_coords, function(df) { df %>% mutate(spatial_extent = list(get_extent(df))) }) # 查看第一个数据框的extent列 result_list_with_col[[1]]$spatial_extent
内容的提问来源于stack exchange,提问作者Cameron
相关产品推荐
相关产品推荐

