在R中如何将sfc数据框列表转换为每行含单个几何图形的数据框?
解决sfc列表转单行对应多边形的数据框问题
我明白你现在的困扰:手里有一个存着sfc(简单要素集合)对象的列表,想把它转换成每行对应一个多边形的数据框,但用as.data.frame或者转置的方法都没达到预期效果。别着急,我给你两种实用的解决方案:
先模拟你的输入场景
首先我们构造一个和你描述一致的可复现示例,方便你对照测试:
library(sf) # 模拟你的sfc列表:每个元素是单个多边形的sfc对象 sfc_list <- list( st_sfc(st_polygon(list(rbind(c(0,0), c(1,0), c(1,1), c(0,1), c(0,0))))), st_sfc(st_polygon(list(rbind(c(1,1), c(2,1), c(2,2), c(1,2), c(1,1))))), st_sfc(st_polygon(list(rbind(c(2,2), c(3,2), c(3,3), c(2,3), c(2,2))))) )
解决方案1:用dplyr绑定行
我们可以把列表里的每个sfc对象包装成单个行的数据框,再用bind_rows合并成最终结果:
library(dplyr) # 把每个sfc元素转成单行数据框,再合并 result_df <- bind_rows(lapply(sfc_list, function(x) data.frame(geometry = x))) # 如果需要保留空间属性(推荐,方便后续做空间分析),转成sf对象 result_sf <- st_as_sf(result_df)
解决方案2:用purrr简化代码
如果你习惯函数式编程风格,用purrr的map_dfr可以一步到位:
library(purrr) library(sf) # 遍历列表,把每个元素转成单行数据框并合并 result_df <- map_dfr(sfc_list, ~data.frame(geometry = .x)) result_sf <- st_as_sf(result_df)
为什么之前的方法没用?
你之前用的as.data.frame会把列表的每个元素当成一列,而不是一行;转置操作则会破坏sfc对象的空间结构,把它拆成无意义的零散值,自然达不到预期效果。而上面的方法是把列表里的每个sfc对象作为单独的一行来合并,完美匹配你要的“每个观测对应一个多边形”的需求。
内容的提问来源于stack exchange,提问作者adl
相关产品推荐
相关产品推荐

