You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

合并结构不同的两个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 15:54:41