R语言中调整DataFrame行顺序以匹配另一个DataFrame的L、M列排序(保留对应G值)
R语言中调整DataFrame行顺序以匹配另一个DataFrame的L、M列排序(保留对应G值)
嘿,我明白你的需求了——要让df2的L和M列完全跟df1的排序一模一样,同时把对应的G值原封不动地带过来,而且df1本身完全不动对吧?这其实是个很常见的匹配行顺序的需求,我给你两种实用的方法,都能完美得到你想要的结果:
首先先把你提供的原始数据列出来,方便大家测试:
# 原始数据框 df1 <- data.frame(L= c(0, 1,1,2,2,2,3,3,3,3), M= c(0,0,1,0,1,2,0,1,2,3), G= (1:10)) df2<- data.frame(L=c(0,1,2,3,1,2,3,2,3,3), M= c(0,0,0,0,1,1,1,2,2,3), G= c(12, 13, 4, 6, 7, 54, 87,56,3,0))
方法一:使用基础R实现(无需额外包)
这种方法适合不想加载第三方包的场景,核心思路是先通过merge匹配对应行,再用match函数对齐顺序:
# 第一步:仅用df1的L、M列与df2合并,保证保留df1的所有行 merged_data <- merge(df1[, c("L", "M")], df2, by = c("L", "M"), all.x = TRUE) # 第二步:根据df1的L、M组合字符串匹配行顺序,确保完全对齐 desired_result <- merged_data[match(paste(df1$L, df1$M), paste(merged_data$L, merged_data$M)), ] # 重置行名(可选,让输出更整洁) rownames(desired_result) <- NULL
执行完这段代码后,desired_result就和你想要的结果完全一致了:L、M列和df1完全相同,G列则是df2中对应(L,M)组合的数值。
方法二:使用dplyr包实现(更简洁直观)
如果你平时习惯用tidyverse系列工具,这个方法会更简洁,利用left_join自动保留左表顺序的特性:
# 先加载dplyr包(如果没安装先运行install.packages("dplyr")) library(dplyr) # 直接用df1的L、M作为左表,左连接df2,自动对齐顺序 desired_result <- df1 %>% select(L, M) %>% # 仅保留需要匹配的列 left_join(df2, by = c("L", "M")) # 按L、M匹配,保留左表顺序
因为你的df2中每个(L,M)组合都和df1一一对应,所以left_join之后会直接继承df1的行顺序,一步到位就能得到目标结果。
你可以运行print(desired_result)验证,输出的内容就是你给出的预期结果:
# 预期输出 desired_result <- data.frame(L= c(0,1,1,2,2,2,3,3,3,3), M= c(0,0,1,0,1,2,0,1,2,3), G= c(12,13,7,4,54,56,6,87,3,0))
备注:内容来源于stack exchange,提问作者Milaa
相关产品推荐
相关产品推荐

