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

R语言使用merge合并dataframe出现值对齐错误如何解决

错误原因

你当前使用merge(df1, df2, by = "Hour")的逻辑不符合需求:merge在合并键存在多对多匹配时,会返回两个表匹配行的笛卡尔积,也就是df1中Hour=1的4行,会和df2中Hour=1的4行两两组合生成16行结果,你观察到的S_Value重复是因为结果前4行刚好是df1中Hour=1的第一行匹配df2中Hour=1的所有行的部分,和你要的按分组内行顺序一一对应的需求完全不符。

解决方法

你的两个数据框在同一个Day+Hour分组下的行数完全一致,只需要给每个分组内的行增加行号作为额外合并键,合并后再删掉行号即可得到预期结果。

方案1:tidyverse(dplyr)实现

library(dplyr)

# 给df1的每个Day+Hour分组添加行号
df1 <- df1 %>% 
  group_by(Day, Hour) %>% 
  mutate(row_id = row_number()) %>% 
  ungroup()

# 给df2的每个Day+Hour分组添加行号
df2 <- df2 %>% 
  group_by(Day, Hour) %>% 
  mutate(row_id = row_number()) %>% 
  ungroup()

# 按三个键合并后删除行号
join <- inner_join(df1, df2, by = c("Day", "Hour", "row_id")) %>% 
  select(-row_id)

方案2:基础R实现(无需额外依赖包)

# 给两个表生成分组内行号
df1$row_id <- ave(df1$Hour, df1$Day, df1$Hour, FUN = seq_along)
df2$row_id <- ave(df2$Hour, df2$Day, df2$Hour, FUN = seq_along)

# 合并后删除行号
join <- merge(df1, df2, by = c("Day", "Hour", "row_id"))
join$row_id <- NULL

内容的提问来源于stack exchange,提问作者smgds

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 09:54:01