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

R:按字母数字对数据帧进行排序,r,sorting,alphanumeric,R,Sorting,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_2

我有一个数据框,它存储每个模型的计数值。型号名称为字母数字。然后我使用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
我尝试使用order()、mixedsort()、arrange()对ggplot2中的数据帧和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)

这里有一个基于您的想法的解决方案“将型号分成一个单独的列,并按该列排序”。然后,您可以使用它对因子级别进行重新排序

library(tidyverse)

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

行数据的顺序与绘图顺序无关,只与因子级别的顺序有关。如果您可以将正确的顺序放入某个变量,
my_order
,然后执行
geneDFColSum$Model=factor(geneDFColSum$Model,levels=unique(geneDFColSum$Model))
以设置数据顺序中的级别顺序。我之前做了完全相同的事情,但没有成功。但是我发现了错误所在。在创建数据帧时,我没有提到“stringsAsFactors=FALSE”。我用这个选项再次创建了数据帧,现在它可以工作了。谢谢你。是的,混合排序法不适用于你喜欢的因素。@neilfws谢谢你的回答。