如何在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
相关产品推荐
相关产品推荐

