多年份土地覆盖提取中map函数count的landcover参数赋值问题
解决多年份土地覆盖提取后的统计格式问题
我明白你的问题了:当处理单个年份的土地覆盖数据时,exact_extract返回的结果里有value列,你可以用count(., landcover = value)轻松得到id、landcover、n的格式;但处理2010-2019年的多波段数据时,返回的列是y2010到y2019,没法直接用value来重命名统计。
核心思路
多波段提取的结果是宽格式(每列对应一个年份),我们需要先把它转换成长格式(年份作为单独一列,土地覆盖值对应另一列),之后再进行统计,这样就能得到类似单年份的结构,还能保留年份信息。
修改后的代码
把你代码中处理提取结果的部分替换成下面这段:
lc_extract_pred <- landcover[[paste0("y", 2010:2019)]] %>% exact_extract(r_cells, progress = FALSE) %>% # 对每个id的提取结果进行处理:转长格式 + 统计 map(~ pivot_longer(., cols = starts_with("y"), # 选择所有以y开头的年份列 names_to = "year", # 列名转为year列 values_to = "landcover") # 列值转为landcover列 %>% count(year, landcover)) %>% # 按年份和土地覆盖类型统计数量 tibble(id = r_cells$id, data = .) %>% unnest(data)
关键细节解释
pivot_longer转换格式:这一步把每个id对应的宽格式数据(y2010,y2011...列)转成了长格式,每一行对应一个年份的土地覆盖值,这样就统一了和单年份提取结果的结构。- 优化年份显示:如果希望年份显示为纯数字(比如
2010而不是y2010),可以在count前加上mutate(year = str_remove(year, "y")):map(~ pivot_longer(., cols = starts_with("y"), names_to = "year", values_to = "landcover") %>% mutate(year = str_remove(year, "y")) %>% count(year, landcover)) - 统计逻辑:转成长格式后,
count(year, landcover)会自动统计每个id下,各年份每种土地覆盖类型的出现次数,最终得到id、year、landcover、n的清晰结构。
这样处理后,你就能得到所有年份的统一格式统计结果啦。
内容的提问来源于stack exchange,提问作者Lime
相关产品推荐
相关产品推荐

