R: 按字母数字混合格式对数据框进行排序

4

我有一个数据框,存储了每个模型的计数值。模型名称是由字母和数字组成的。然后使用ggplot2生成一个条形图,将模型显示在x轴上,计数显示在y轴上。我想对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)

有没有一种方法可以实现这个目的?我可以将型号分离到一个单独的列中,并按该列进行排序。但是我正在寻找是否有更简单的方法。


2
您的行数据的顺序对绘图的顺序没有影响,只有因子水平的顺序才有影响。 如果您可以将正确的顺序输入某个变量 my_order,那么请执行以下操作 geneDFColSum$Model = factor(geneDFColSum$Model, levels = unique(geneDFColSum$Model)) 来设置数据顺序中的水平顺序。 - Gregor Thomas
2个回答

4
你需要对因子的级别进行排序,而不是数据行:
dd$Model = factor(dd$Model, levels = gtools::mixedsort(dd$Model))
ggplot(dd, aes(x = Model, y = Count)) + geom_col()

使用此作为输入数据:

在此输入图像描述


相关IT技术的翻译就到这里了,请您再告诉我有什么能够帮忙的地方。

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)

我之前做了完全相同的事情,但是没有成功。然而,我找出了错误所在。当我创建数据框时,我没有提到" stringsAsFactors = FALSE "。我再次使用这个选项创建了数据框,现在它可以工作了。谢谢。 - SriniShine
是的,mixedsort 在因子上的工作方式不如你所愿。 - Gregor Thomas

2

这是一个基于你的想法“将型号号码分成单独的列并按照该列排序”的解决方案。然后,您可以使用它来重新排序因子水平。

library(tidyverse)

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

enter image description here


@neilfws 感谢您的回答。 - SriniShine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接