合并结构不同的两个DataFrame:宽格式数据与元数据融合问题
宽格式DataFrame与城市元数据合并方案
你的问题核心是df1为宽格式(城市作为列名),df2为长格式元数据(城市作为行),结构不匹配导致无法直接合并。解决思路是先把df1转成长格式,匹配后再按需处理。
步骤1:将df1转为长格式(Tidy格式)
使用tidyverse的pivot_longer函数,把除Date外的所有列(城市名)转为Location列,对应数值转为Value列:
library(tidyverse) # 转换df1为长格式 df1_long <- df1 %>% pivot_longer( cols = -Date, # 保留Date列,其他列都转换 names_to = "Location", # 列名转为Location列的值 values_to = "Value" # 对应单元格数值转为Value列 )
转换后的df1_long结构示例:
Date Location Value <dbl> <chr> <dbl> 1 20200101 Machrihanish 8.5 2 20200101 High_Wycombe 6.9 3 20200101 Camborne 9.6 4 20200101 Dun_Fell 3.3 5 20200101 Plymouth 9.9 ...
步骤2:合并长格式数据与元数据
用left_join基于Location列合并df1_long和df2,这样每个日期-城市组合都会带上对应的经纬度和海拔:
# 合并数据 merged_df <- df1_long %>% left_join(df2, by = "Location")
合并后的完整结构示例:
Date Location Value Longitude Latitude Elevation <dbl> <chr> <dbl> <dbl> <dbl> <dbl> 1 20200101 Machrihanish 8.5 -5.70 55.4 10 2 20200101 High_Wycombe 6.9 -0.807 51.7 204 3 20200101 Camborne 9.6 -5.33 50.2 87 ...
可选:转回宽格式(如果需要)
如果需要回到类似原df1的宽结构,可使用pivot_wider将元数据也拆分为对应城市的列:
merged_wide <- merged_df %>% pivot_wider( id_cols = Date, names_from = Location, values_from = c(Value, Longitude, Latitude, Elevation) )
最终宽格式会包含Date、Value_Machrihanish、Longitude_Machrihanish等列,每个城市的数值和元数据都对应单独的列。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

