多期同区域栅格数据的年度间数值插值技术咨询
嘿,这事儿我熟!既然你已经把六个年份的栅格数据都转成了结构一致的data.frame,那插值填充1991-2014年每个单元格的数值其实挺清晰的,我给你捋个用R实现的靠谱流程:
第一步:合并所有年份的data.frame
首先得把六个单独的data.frame合并到一起,同时保留每个数据对应的年份信息。假设你的六个数据框分别叫df_1990、df_1995、df_2000、df_2005、df_2010、df_2015,可以这么做:
library(dplyr) # 给每个数据框添加年份列,然后放到列表里 df_list <- list( df_1990 = mutate(df_1990, year = 1990), df_1995 = mutate(df_1995, year = 1995), df_2000 = mutate(df_2000, year = 2000), df_2005 = mutate(df_2005, year = 2005), df_2010 = mutate(df_2010, year = 2010), df_2015 = mutate(df_2015, year = 2015) ) # 合并成一个大的数据框 combined_df <- bind_rows(df_list)
第二步:按单元格分组做插值
因为每个(x,y)坐标对应的是独立的单元格,所以我们要按x和y分组,对每个组的年份和数值进行插值。这里用线性插值最常用,要是你的数据有明显非线性趋势,也可以换成样条插值:
library(tidyr) # 假设你的数值列叫value,先生成1990-2015所有年份,再插值 interpolated_df <- combined_df %>% group_by(x, y) %>% # 生成1990到2015的每一个年份 complete(year = seq(1990, 2015, by = 1)) %>% # 线性插值填充缺失的年份数值 mutate(value = approx(year, value, xout = year)$y) %>% ungroup()
如果想用样条插值(更适合非线性变化的数据),把上面的approx换成spline就行:
mutate(value = spline(year, value, xout = year)$y)
第三步:验证与后续处理(可选)
- 你可以检查插值后的数据有没有缺失值:
sum(is.na(interpolated_df$value)),如果有,大概率是某个(x,y)组在原始年份里就有缺失,这时候可以根据情况补全或者过滤掉。 - 如果需要把插值后的数据拆回每个年份单独的
data.frame,方便后续转回栅格:
# 按年份拆分数据框 split_dfs <- interpolated_df %>% split(.$year) # 比如取1991年的数据:split_dfs[["1991"]]
- 要是想转回栅格格式,用
raster包的rasterFromXYZ()函数就行,每个年份的data.frame都能转成对应的栅格文件。
内容的提问来源于stack exchange,提问作者Vivien Leonard
相关产品推荐
相关产品推荐

