【问题标题】:sort by chromosome name按染色体名称排序
【发布时间】:2013-09-28 02:04:04
【问题描述】:

我有一个染色体名称向量

q<-c("1","10","11","12","13","14","15","16","17",
     "18","19","20","21","22","2","3","4","5","6",
     "7","8","9","X","Y","M")

我想将它们排序为

q<-c("1","2","3","4","5","6","7","8","9","10","11",
     "12","13","14","15","16","17","18","19","20",
     "21","22","X","Y","M")

我试着自己下订单

chrOrder <-c((1:22),"X","Y","M")

并像使用它

factor(cbind(q),levels=chrOrder)

但我还是听不懂。

已编辑..... 我有类似的情况,但稍微先进。我有一个三列的数据框,名称,染色体,开始

df <-data.frame(name =c("a","a","a","b","b","b"), chrom = c(1,2,10,1,3,"X"), start=c(100,200,300,500,300,200))

我需要先按名称排序,然后是染色体和开头。 结果应该是这样的

name chrom start
a     1   100
a     10  300
a     2   200
b     1   500
b     3   300
b     X   200

我不知道如何在下面使用 chrOrder:

indata  <- df[do.call(order,df[,c(name, chrom, start)]),];

【问题讨论】:

  • 为什么不直接使用chrOrder呢?为什么你期望factor 对你的向量进行排序?同样,cbind 在这里无效。
  • 我对已编辑问题的预期结果感到困惑。第三行不在第二行之前是不是错了?
  • 它先按“名称”排序,然后按“铬”排序。数字的排序不是自然的方式。它就像 1,10,100,2,200,22,299,300

标签: r sorting


【解决方案1】:

你的方法很好;你只需要sort 结果因子。你还应该设置ordered=TRUE:

sort(factor(q,levels=chrOrder, ordered=TRUE))

不,正如已经指出的那样,您不必使用有序因子,但它肯定没有错——而且可以说它更好。因素适用于这种情况,您有明确定义的水平。见this previous question on on factor vs character

现在你已经编辑了你的问题,因为排序很简单,所以一个因素的情况更加强大:

df <- data.frame(name=c("a","a","a","b","b","b"),
                 chrom = c(1,2,10,1,3,"X"),
                 start=c(100,200,300,500,300,200))

chrOrder <-c((1:22),"X","Y","M")
df$chrom <- factor(df$chrom, chrOrder, ordered=TRUE)

df[do.call(order, df[, c("name", "chrom", "start")]), ]

考虑到因子的级别,R 确切地知道如何对元素进行排序。

我已经按照你的方法使用了排序方法,但你可能想知道还有更漂亮的方法,例如:

library(plyr)
df <- arrange(df, name, chrom, start)

【讨论】:

  • 谢谢,我在问题中编辑了其他问题
  • 您只需将您的chrom 列重新分配为有序级别的一个因素。
【解决方案2】:

factorcbind 在这里什么都不做(好吧,factor 可以,但它不会立即有用)。

在您的具体情况下,只需说 q &lt;- chrOrder 即可解决问题,不是吗?

更一般地,您可以使用match 来获取向量x 中的项目的索引,这些索引按另一个向量y 中的项目排序:

> match(chrOrder, q)
 [1]  1 15 16 17 18 19 20 21 22  2  3  4  5  6  7  8  9 10 11 12 13 14 23 24 25

现在您可以使用这些索引来索引q 并对其进行排序:

> q[match(chrOrder, q)]
 [1] "1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9"  "10" "11" "12" "13" "14" "15"
[16] "16" "17" "18" "19" "20" "21" "22" "X"  "Y"  "M"

...所以这是一般的方法。例如,作为一个更有用的示例:假设您实际上有一个 data.frame 的基因和一个 chr 列,您可以按如下方式对数据框的行进行排序:

> # Some test data
> df <- data.frame(chr = q, value = rnbinom(length(q), 1, 0.01),
+                  row.names = paste('gene', seq_along(q)))
> df <- df[match(chrOrder, df$chr), ]
> head(df)
        chr value
gene 1    1   270
gene 15   2    51
gene 16   3   115
gene 17   4    15
gene 18   5   196
gene 19   6    34

...数据框列现在按其chr 列按您想要的顺序排序。

【讨论】:

    猜你喜欢
    • 2019-12-16
    • 2011-09-19
    • 1970-01-01
    • 1970-01-01
    • 2013-07-21
    • 2018-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多