合并不同观测数的两个数据框 按国家匹配分析AEZ时序变化
操作步骤
第一步:优先使用原始的Period1、Period2数据框操作(你当前用cbindX合并的结果已经出现行错位,不建议继续使用)
你两个原始数据框列结构完全一致,假设列名分别是AEZ、Country、File_name、Share,直接按Country和AEZ两个字段做匹配合并即可,既能保留两个时段所有条目,也不会出现错位问题。
方法1:使用tidyverse包的连接函数(更易读)
# 加载包 library(dplyr) # 全连接:保留两个时段所有国家+AEZ组合,缺失值用NA填充,方便查看哪些AEZ是某个时段独有 aez_change <- full_join(Period1, Period2, by = c("Country", "AEZ"), suffix = c("_1981_2010", "_2011_2040")) # 如果只需要两个时段都存在的国家+AEZ组合,用内连接 # aez_change <- inner_join(Period1, Period2, by = c("Country", "AEZ"), suffix = c("_1981_2010", "_2011_2040"))
得到结果后可以直接计算面积变化量:
aez_change <- aez_change %>% mutate(share_change = Share_2011_2040 - Share_1981_2010)
方法2:使用base R的merge函数
# 全连接 aez_change <- merge(Period1, Period2, by = c("Country", "AEZ"), all = TRUE, suffixes = c("_1981_2010", "_2011_2040")) # 内连接 # aez_change <- merge(Period1, Period2, by = c("Country", "AEZ"), all = FALSE, suffixes = c("_1981_2010", "_2011_2040"))
如果必须用你已经合并的new_data2来处理
可以先拆分回两个时段的子数据集,去重后再做连接:
# 拆分Period1子数据,重命名列 p1 <- new_data2[, c("AEZ_1", "Country_1", "Share_1")] colnames(p1) <- c("AEZ", "Country", "Share") p1 <- unique(p1) # 去掉cbind导致的重复行 # 拆分Period2子数据,重命名列 p2 <- new_data2[, c("AEZ_2", "Country_2", "Share_2")] colnames(p2) <- c("AEZ", "Country", "Share") p2 <- unique(p2) # 去掉重复行 # 再按上述方法合并即可 aez_change <- merge(p1, p2, by = c("Country", "AEZ"), all = TRUE, suffixes = c("_1", "_2"))
内容的提问来源于stack exchange,提问作者Shunrei
相关产品推荐
相关产品推荐

