如何先按自定义列表顺序对数据框的letters列排序,再对numbers列升序排序?
自定义列顺序排序的解决方案
要实现按照你指定的letters顺序排序,核心思路是把letters列转换成**因子(factor)**并自定义它的层级顺序,这样排序函数就会遵循你设定的规则,而非默认的字母顺序。下面给你两种常用的实现方式:
基础R实现
先将letters列转为因子,指定你想要的层级顺序,再执行排序:
set.seed(42) df <- data.frame(letters=c(rep('data', 5), rep('oh', 5), rep('yeah', 5), rep('silly', 5)), numbers=runif(n = 20, min = 1, max = 10)) # 转换为因子并指定自定义顺序 df$letters <- factor(df$letters, levels = c('silly', 'data', 'oh', 'yeah')) # 按自定义letters顺序 + numbers升序排序 df_sorted <- df[with(df, order(letters, numbers)), ]
tidyverse/dplyr实现
如果你习惯用tidyverse生态的工具,写法会更简洁直观:
library(dplyr) set.seed(42) df <- data.frame(letters=c(rep('data', 5), rep('oh', 5), rep('yeah', 5), rep('silly', 5)), numbers=runif(n = 20, min = 1, max = 10)) df_sorted <- df %>% # 转换为因子并指定层级 mutate(letters = factor(letters, levels = c('silly', 'data', 'oh', 'yeah'))) %>% # 按自定义顺序排序,同一组内按numbers升序 arrange(letters, numbers)
原理说明
因子的levels参数定义了该列的排序优先级,当使用order()或arrange()时,会严格按照levels的顺序排列分组,同一分组内再按照numbers的数值升序排列,完全符合你的需求。
内容的提问来源于stack exchange,提问作者curious
相关产品推荐
相关产品推荐

