R语言如何合并含重复站点行的水质数据与土地利用数据
R 数据框匹配合并解决方案
错误方法原因
cbind是按行位置直接拼接两个数据框,不会按照站点、年份的匹配逻辑关联数据,且你的两个数据框行数不一致,拼接结果完全不符合需求purrr::reduce主要用于迭代多对象的批量操作,仅传入两个数据框且未指定匹配键时,无法实现按条件关联的效果
前置处理逻辑
需要先从水质数据的Date列提取采样年份,再以站点编号st、年份year作为公共匹配键,将土地利用数据左连接到水质数据中,该方式会保留水质数据所有行,同站点同一年份的多条水质数据会自动匹配对应的土地利用指标。
具体实现代码
方法1:dplyr + lubridate 实现(推荐,代码易读)
# 加载所需包 library(dplyr) library(lubridate) # 1. 从水质数据日期列提取年份 water_df <- water_df %>% mutate(year = year(dmy(Date))) # dmy对应日/月/年的日期格式,自动识别转换 # 2. 按st和year两个键左连接 join_df <- left_join(water_df, land_df, by = c("st", "year"))
方法2:base R 原生实现
# 1. 提取年份 water_df$year <- format(as.Date(water_df$Date, format = "%d/%m/%Y"), "%Y") water_df$year <- as.integer(water_df$year) # 2. merge函数关联,all.x = TRUE保留所有水质数据行 join_df <- merge(water_df, land_df, by = c("st", "year"), all.x = TRUE)
结果说明
最终得到的join_df会保留原水质数据的所有行,匹配到对应站点、年份的土地利用数据会自动填充到对应行,未匹配到的行(比如示例中站点A2006年的采样数据、站点B2005年的采样数据)土地利用列会返回NA,可根据后续需求自行过滤或补充数据。
内容的提问来源于stack exchange,提问作者wesleysc352
相关产品推荐
相关产品推荐

