如何按特定重复值序列对R语言DataFrame进行排序
按自定义顺序重新排列分组内的DataFrame序列
问题描述
现有如下R语言DataFrame:
df <- data.frame(col1 = c(1,1,1,1,2,2,2,2,3,3,3,3), col2 = rep(c("A", "B", "C", "D"), 3))
输出为:
col1 col2 1 1 A 2 1 B 3 1 C 4 1 D 5 2 A 6 2 B 7 2 C 8 2 D 9 3 A 10 3 B 11 3 C 12 3 D
需要按col1分组,将每组内的col2按照A、C、B、D的顺序重新排序,得到如下结果:
df_result <- data.frame(col1 = c(1,1,1,1,2,2,2,2,3,3,3,3), col2 = rep(c("A", "C", "B", "D"), 3))
输出为:
col1 col2 1 1 A 2 1 C 3 1 B 4 1 D 5 2 A 6 2 C 7 2 B 8 2 D 9 3 A 10 3 C 11 3 B 12 3 D
解决方案
方法1:使用dplyr(tidyverse生态)
通过分组后,利用因子的自定义水平指定排序规则:
library(dplyr) # 定义目标排序顺序 custom_order <- c("A", "C", "B", "D") df_sorted <- df %>% group_by(col1) %>% # 将col2转为指定水平的因子,按此规则排序 arrange(factor(col2, levels = custom_order), .by_group = TRUE) %>% ungroup()
方法2:Base R实现
直接修改col2的因子水平,再结合col1完成排序:
custom_order <- c("A", "C", "B", "D") # 将col2转为指定水平的因子 df$col2 <- factor(df$col2, levels = custom_order) # 按col1和col2排序 df_sorted <- df[order(df$col1, df$col2), ] # 若需要将col2转回字符类型,可执行: # df_sorted$col2 <- as.character(df_sorted$col2)
两种方法最终都会得到符合要求的排序结果。
内容的提问来源于stack exchange,提问作者trilisser
相关产品推荐
相关产品推荐

