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

如何在R中重排数据框列并合并两个数据框(优先tidyverse方法)

问题:按指定顺序匹配并合并数据框

测试数据

df1 <- data.frame(block = c('1' , '1' , '1' , '2' , '2', '2' , '3' , '3' , '3') ,
                 type = c('a' , 'b' , 'c' , 'b' , 'a' , 'c' , 'c' , 'b' , 'a') ,
                 number = c('1' , '3' , '6' , '2' , '3' , '4' , '5' , '1' , '3'))

df2 <- data.frame(block = c('1' , '1' , '1' , '2' , '2', '2' , '3' , '3' , '3') ,
                  type = c('b' , 'c' , 'a' , 'c' , 'a' , 'b' , 'a' , 'c' , 'b') ,
                  value = c('3' , '2' , '3' , '5' , '1' , '6' , '3' , '2' , '1'))

需求

按照df1的type列顺序,将df2中对应block和type的value值匹配过来,合并后保留df1的结构,移除多余的block列,最终得到如下结果:

df3 <- data.frame(block = c('1' , '1' , '1' , '2' , '2', '2' , '3' , '3' , '3') ,
                  type = c('a' , 'b' , 'c' , 'b' , 'a' , 'c' , 'c' , 'b' , 'a') ,
                  number = c('1' , '3' , '6' , '2' , '3' , '4' , '5' , '1' , '3') , 
                  value = c('3' , '3' , '2' , '6' , '1' , '5' , '2' , '1' , '3'))

tidyverse解决方案

利用left_join按block和type精确匹配,自动保留df1的原有行顺序,无需额外排序:

library(tidyverse)

# 合并数据并整理列顺序
df3 <- df1 %>%
  left_join(df2, by = c("block", "type")) %>%
  select(block, type, number, value)

# 验证结果
print(df3)

说明

  • left_join会根据每行的block和type,从df2中匹配对应的value,完美对应df1的行顺序
  • select用于确保列顺序和目标结果一致,同时避免重复的block列

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 21:57:32