You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多年份土地覆盖提取中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)

关键细节解释

  1. pivot_longer转换格式:这一步把每个id对应的宽格式数据(y2010, y2011...列)转成了长格式,每一行对应一个年份的土地覆盖值,这样就统一了和单年份提取结果的结构。
  2. 优化年份显示:如果希望年份显示为纯数字(比如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))
    
  3. 统计逻辑:转成长格式后,count(year, landcover)会自动统计每个id下,各年份每种土地覆盖类型的出现次数,最终得到id、year、landcover、n的清晰结构。

这样处理后,你就能得到所有年份的统一格式统计结果啦。

内容的提问来源于stack exchange,提问作者Lime

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:27:59