【问题标题】:Sorting by a slice of the text string按文本字符串的切片排序
【发布时间】:2015-01-15 16:41:26
【问题描述】:

我想对我的数据进行排序,但标准的 Excel“A 到 Z”排序功能并没有削减它。我希望有人知道如何制作适合我需要的自定义排序。这是一个示例:

chrPos        count
chr1_10000598   10
chr1_10000647   10
chr1_10001370   30
chr1_10001390   30
chr1_10001392   30
chr1_10001414   30
chr1_10001418   30
chr1_10001473   10
chr1_10001505   10
chr1_10001516   20
chr1_1000156    30

正如您所见,使用内置排序功能时最后一行不合适,这应该是第一行而不是最后一行。我认为添加第二层排序会达到目的,但该层必须根据下划线后面的数字按升序排序。

有什么想法吗?改用 R 会更容易吗?

编辑以添加来自 cmets 的详细信息:

排序是在下划线之后的数字部分升序,在 chr 数字部分升序(从 1 到 22 包括在内),然后按 chrM_、chrX_ 和 chrY_ 的顺序(它们的数字部分也按升序排序)。

下划线后的数字部分最多可达 8 位。

【问题讨论】:

  • 抱歉,我的意思是第一个,而不是第三个。下划线后基本上是升值。我忘了提到的是 chr# 不是恒定的......即这个列表从 chr1 到 chr22 它是生物数据。
  • 是的,没睡多抱歉哈哈。我希望它先按 chr# 排序,然后按下划线后面的数字排序。
  • 我的逻辑是;因为这是一个基因组位置,所以我希望它线性排序,因为基因组从开始到结束......例如,从 chr1_1 开始,到 chr22_99999999 结束。如果这有帮助的话。

标签: r string excel sorting


【解决方案1】:

假设chrPos在A列,请在辅助列中试试:

=IF(FIND("_",A1)=5,CHAR(64+MID(A1,4,1)),CHAR(64+MID(A1,4,2)))&REPT("0",8-LEN(A1)+FIND("_",A1))&MID(A1,FIND("_",A1)+1,8) 

或者,对于 cmets 中提到的其他要求:

=IF(MID(A1,4,1)="M","W",IF(MID(A1,4,1)="X","X",IF(MID(A1,4,1)="Y","Y",IF(FIND("_",A1)=5,CHAR(64+MID(A1,4,1)),CHAR(64+MID(A1,4,2))))))&REPT("0",9-LEN(A1)+FIND("_",A1))&MID(A1,FIND("_",A1)+1,9)

然后在顶部选择辅助列、复制、选择性粘贴、值并将其用于排序。

【讨论】:

  • 您好,谢谢,非常接近!当下划线后有 8 个数字时,它适用于所有情况,但下划线后有 9 个数字时会出错。抱歉,我没有在我发布的内容中显示任何 9 个数字的实例,但它在我的数据集中。如果 chrM、chrX 和 chrY,这 3 个实例中也存在错误。再次感谢您的帮助,我永远无法做到这一点......
  • 我很抱歉。有 chr1 到 chr22 和 chrM、chrY 和 chrX。然后下划线后面最多有 9 个字符的数字。以下是一些捕获这两个错误实例的屏幕截图:imgur.com/SnCddcD,MnGq4ok
  • 在 chr1 到 chr21 之前或之后,都可以。
  • 在 chr21 之后,这是一个错字。因此,例如,订单将变为 chr1_#-chr22_#,chrM_#,chrY_#,chrX_#。其中 # 也将从 1 升序排列到 999999999(九位数字)。
  • 感谢所有帮助。我很感激。
猜你喜欢
  • 2021-04-01
  • 2020-11-27
  • 2017-10-16
  • 2014-12-04
  • 2021-11-28
  • 1970-01-01
  • 1970-01-01
  • 2016-08-29
  • 1970-01-01
相关资源
最近更新 更多