存在重复值时如何按自定义顺序对DataFrame行排序?
解决方法
由于你的排序规则是完全固定的无逻辑顺序,且存在重复的stat值,无法仅通过stat的因子排序实现,需要基于目标顺序给每行数据分配排序索引,再按索引排序,具体步骤如下:
1. 加载所需工具包
需要用dplyr处理数据,writexl导出Excel(也可替换为openxlsx等工具):
install.packages(c("dplyr", "writexl")) library(dplyr) library(writexl)
2. 定义目标顺序的参考数据
把你需要的最终顺序做成参考数据框,用于匹配原始数据的排序位置:
target_order <- structure(list(stat = c("a", "b", "c", "d", "b", "c", "e", "f"), value = c(9L, 1L, 3L, 7L, 5L, 5L, 8L, 5L)), class = "data.frame", row.names = c(NA, -8L)) # 给目标顺序添加排序索引 target_order <- target_order %>% mutate(sort_index = row_number())
3. 匹配索引并排序原始数据
通过stat和value的组合匹配,给原始数据添加排序索引,再按索引排序:
# 原始数据 xyzzy <- structure(list(stat = c("c", "d", "a", "b", "b", "c", "e", "f"), value = c(3L, 7L, 9L, 5L, 1L, 5L, 8L, 5L)), class = "data.frame", row.names = c(NA, -8L)) # 匹配排序索引并完成排序 sorted_df <- xyzzy %>% inner_join(target_order, by = c("stat", "value")) %>% arrange(sort_index) %>% select(-sort_index) # 移除临时索引列
4. 导出到Excel文件
write_xlsx(sorted_df, "sorted_result.xlsx")
补充说明
如果数据中存在**(stat, value)组合重复**的情况,需要给原始数据添加原始行号作为唯一标识,确保匹配的准确性,示例代码如下:
# 给原始数据添加原始行号 xyzzy <- xyzzy %>% mutate(original_row = row_number()) # 目标顺序需同步对应原始行号,再基于行号完成匹配排序
内容的提问来源于stack exchange,提问作者Andre
相关产品推荐
相关产品推荐

