如何展开spatialsampling的spatial_clustering_cv对象并为sf数据添加折ID
为SF对象添加空间聚类折叠ID(Fold IDs)
要给SF对象添加空间聚类生成的折叠ID,不需要用unnest处理spatial_clustering_cv的输出——它返回的是特殊的拆分对象,直接展开会报错。下面是正确的实现方法:
解决方案代码
library(sf) library(spatialsample) library(modeldata) library(tidyr) library(purrr) library(stringr) # 加载数据并转换为SF对象 data("ames", package = "modeldata") ames_sf <- sf::st_as_sf( ames, coords = c("Longitude", "Latitude"), crs = 4326 ) # 生成15组空间聚类折叠 set.seed(123) cluster_folds <- spatial_clustering_cv(ames_sf, v = 15) # 提取每个样本对应的折叠ID fold_assignments <- map_dfr( seq_len(nrow(cluster_folds)), function(fold_num) { # 获取当前折叠的拆分对象 current_split <- cluster_folds$splits[[fold_num]] # 提取测试集的行索引(若需要标记训练集,改用analysis()函数) test_indices <- assessment(current_split) # 生成格式化的折叠ID(如Fold01、Fold02) fold_id <- paste0("Fold", str_pad(fold_num, 2, pad = "0")) tibble( rowid = test_indices, id = fold_id ) } ) # 将折叠ID合并到原SF对象 ames_sf_with_fold <- ames_sf %>% mutate(rowid = row_number()) %>% left_join(fold_assignments, by = "rowid") %>% select(-rowid)
代码说明
- 提取折叠索引:通过
map_dfr遍历每个折叠,用assessment()获取该折叠测试集的行索引;如果要标记训练集,替换为analysis()即可。 - 格式化折叠ID:用
str_pad确保折叠ID是两位数格式,匹配你期望的输出样式。 - 合并到原数据:给原SF对象添加临时行号,通过行号关联折叠ID,最后移除临时行号列。
原错误原因
spatial_clustering_cv返回的cluster_folds对象中,splits列的每个元素是spatial_clustering_split类型的拆分对象,不是普通向量或列表。unnest无法解析这种特殊对象,因此会抛出类型不匹配的错误。
效果验证
查看处理后的核心列,会看到新增的id列包含对应的折叠ID:
head(select(ames_sf_with_fold, Street, geometry, id))
输出示例:
# A tibble: 6 × 3 Street geometry id <fct> <POINT [°]> <chr> 1 Pave (-93.61975 42.05403) Fold01 2 Pave (-93.61976 42.05301) Fold01 3 Pave (-93.61939 42.05266) Fold01 4 Pave (-93.6173 42.05128) Fold02 5 Pave (-93.61729 42.05106) Fold02 6 Pave (-93.61682 42.05134) Fold02
内容的提问来源于stack exchange,提问作者Nova
相关产品推荐
相关产品推荐

