在R中基于其他DataFrame数据为Events添加Avtemp列
优雅实现R中多数据框的天气温度匹配
问题描述
我有如下Events数据框:
Events
| Date | City | Event |
|---|---|---|
| 2012-06-01 | LA | A |
| 2014-05-02 | London | B |
| 2017-03-15 | Paris | C |
同时存在多个以城市命名的天气数据框(超过10个),示例如下:
LA_weather
| Date | Avtemp |
|---|---|
| 2012-06-01 | 23 |
| 2012-06-02 | 22 |
| ---------- | ------ |
| 2017-12-31 | 15 |
London_weather
| Date | Avtemp |
|---|---|
| 2012-06-01 | 16 |
| 2012-05-02 | 21 |
| ---------- | ------ |
| 2017-12-31 | 10 |
需要根据Events中的City和Date字段,匹配对应城市天气数据框的Avtemp值,为Events新增该列,最终得到如下结果:
Events(期望结果)
| Date | City | Event | Avtemp |
|---|---|---|---|
| 2012-06-01 | LA | A | 23 |
| 2014-05-02 | London | B | 21 |
| 2017-03-15 | Paris | C | 10 |
目前已想到将所有天气数据合并为带City列的大表再关联,但希望找到更优雅的实现方式。
解决方案
方法1:批量合并天气数据后关联(高效通用)
借助tidyverse中的purrr工具批量处理所有天气数据框,自动添加城市标识后合并,再与Events关联:
# 加载依赖包 library(tidyverse) # 列出所有天气数据框的名称(根据实际情况补充完整) weather_df_names <- c("LA_weather", "London_weather", "Paris_weather") # 批量读取数据、添加城市列并合并成总表 combined_weather <- map_df(weather_df_names, function(name) { get(name) %>% mutate(City = str_remove(name, "_weather")) }) # 关联Events数据,匹配Date和City字段 Events_with_temp <- Events %>% left_join(combined_weather, by = c("Date", "City"))
这种方式仅需一次合并,后续关联效率高,适合数据量较大或需要重复使用天气数据的场景。
方法2:逐行匹配(无需合并大表)
如果不想预先合并所有天气数据,可以用rowwise()逐行定位对应城市的数据框,提取目标温度:
library(dplyr) Events_with_temp <- Events %>% rowwise() %>% mutate(Avtemp = get(paste0(City, "_weather")) %>% filter(Date == cur_data()$Date) %>% pull(Avtemp)) %>% ungroup()
该方法代码直观,无需提前整理所有天气数据框名称,适合数据量较小或临时查询的场景。但如果Events行数极多,性能会低于方法1。
内容的提问来源于stack exchange,提问作者Delopera
相关产品推荐
相关产品推荐

