R:按字母数字对数据框进行排序

R: Sorting a data frame by an alphanumeric

我有一个数据框,它存储每个模型的计数值。模型名称是字母数字。然后我使用 ggplot2 生成一个条形图,其中模型在 x 轴上,计数在 y 轴上。我想订购我的 x 轴。 x 轴在数据框中和图中的 x 轴中显示如下。我想对其进行正确排序,例如 M_1、M_2、M_3、M_10、M_11、M_20 等

Model   Count
M_1 73
M_10    71
M_100   65
M_11    65
M_110   64
M_111   71
M_13    70
M_130   73
M_2 72
M_20    69
M_200   63
M_21    72
M_210   72
M_211   67
M_3 78
M_30    76
M_300   59
M_31    73
M_310   64

我尝试在 ggplot2 中使用 order()、mixedsort()、arrange() 对数据框进行排序,然后使用 factor()。然而并没有成功。

geneDFColSum[with(geneDFColSum, order(geneDFColSum$Model)), ]

geneDFColSum[with(geneDFColSum, mixedsort(geneDFColSum$Model)), ]

library(dplyr)
  arrange(geneDFColSum, Model)

有办法实现吗?我可以将型号分成一个单独的列并按该列排序。但是看看是否有简单的方法。

您需要对因子水平而不是数据行进行排序:

dd$Model = factor(dd$Model, levels = gtools::mixedsort(dd$Model))
ggplot(dd, aes(x = Model, y = Count)) + geom_col()


将其用作输入数据:

dd = read.table(text = "Model   Count
M_1 73
M_10    71
M_100   65
M_11    65
M_110   64
M_111   71
M_13    70
M_130   73
M_2 72
M_20    69
M_200   63
M_21    72
M_210   72
M_211   67
M_3 78
M_30    76
M_300   59
M_31    73
M_310   64", header = T, stringsAsFactors = FALSE)

这是基于您的想法的解决方案 "separate the model number into a separate column and order by that column"。然后您可以使用它来重新排序因子水平。

library(tidyverse)

geneDFColSum %>% 
  mutate(Order = as.numeric(gsub("M_", "", Model))) %>% 
  arrange(Order) %>% 
  mutate(Model = factor(Model, levels = Model)) %>%
  ggplot(aes(Model, Count)) + 
    geom_col()