如何在R中将目标dataframe排序为与原始dataframe一致的行顺序
将调整后的DataFrame排序为与原始DataFrame一致的行顺序
核心思路
两个DataFrame的人员信息唯一标识为Name列(若存在姓名重复,可结合PCD+Household+Name作为复合唯一键),通过匹配原始DataFrame的姓名顺序,对调整后的DataFrame进行重排序即可。
实现步骤(R语言)
- 加载原始与调整后的DataFrame
# 原始DataFrame original_df <- structure(list(PCD = c(10101L, 10101L, 10101L, 10101L, 10101L, 30201L, 30201L, 30201L, 30201L, 30201L, 30201L, 30108L, 30108L, 30108L, 30108L), AE = c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 5L, 5L, 5L, 5L), UGM = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), Household = c(20L, 20L, 20L, 20L, 20L, 50L, 50L, 50L, 50L, 50L, 50L, 2L, 2L, 2L, 2L), Home = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), Line = c(1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 6L, 1L, 2L, 3L, 4L), Name = c("Fabiola Nevado", "Kevin Molina", "Ana Montado", "Julia Mendoza", "Luis Ulate", "Julian Ugalde", "Hannia Lopez", "John Smith", "Jazmin Rivera", "Francis Gonzales", "Sharon Martinez", "Adriana Lopez", "Esteban Bonilla", "Aubrey Smith", "Kate Fernandez"), Sex = c(1L, 2L, 1L, 1L, 2L, 2L, 1L, 2L, 1L, 2L, 1L, 1L, 2L, 1L, 1L)), class = "data.frame", row.names = c(NA, -15L)) # 调整后的DataFrame adjusted_df <- structure(list(PCD = c(10101L, 10101L, 10101L, 10101L, 10101L, 30201L, 30201L, 30201L, 30201L, 30201L, 30201L, 30108L, 30108L, 30108L, 30108L), AE = c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 5L, 5L, 5L, 5L), UGM = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), Household = c(20L, 20L, 20L, 20L, 20L, 50L, 50L, 50L, 50L, 50L, 50L, 2L, 2L, 2L, 2L), Home = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), Line = c(1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 6L, 1L, 2L, 3L, 4L), Name = c("Julia Mendoza", "Kevin Molina", "Ana Montado", "Fabiola Nevado", "Luis Ulate", "John Smith", "Hannia Lopez", "Julian Ugalde", "Jazmin Rivera", "Francis Gonzales", "Sharon Martinez", "Adriana Lopez", "Esteban Bonilla", "Aubrey Smith", "Kate Fernandez"), Sex = c(1L, 2L, 1L, 1L, 2L, 2L, 1L, 2L, 1L, 2L, 1L, 1L, 2L, 1L, 1L)), class = "data.frame", row.names = c(NA, -15L))
- 单键匹配排序(适用于姓名无重复场景)
# 基于原始DataFrame的Name顺序重排调整后的DataFrame sorted_df <- adjusted_df[match(original_df$Name, adjusted_df$Name), ] # 重置行名(可选,使行索引连续) row.names(sorted_df) <- NULL
- 复合键匹配排序(适用于存在姓名重复的场景)
如果不同家庭/区域有同名人员,可结合PCD、Household和Name生成复合唯一键进行匹配:
# 生成复合唯一键 original_key <- paste(original_df$PCD, original_df$Household, original_df$Name, sep = "|") adjusted_key <- paste(adjusted_df$PCD, adjusted_df$Household, adjusted_df$Name, sep = "|") # 基于复合键重排 sorted_df <- adjusted_df[match(original_key, adjusted_key), ] row.names(sorted_df) <- NULL
- 验证排序结果
运行以下代码确认排序后的DataFrame与原始完全一致:
all.equal(sorted_df, original_df)
返回TRUE则说明排序正确。
内容的提问来源于stack exchange,提问作者Jesús Asdrúbal Molina Vázquez
相关产品推荐
相关产品推荐

