2013-09-25 31 views
2

我有染色體名稱的矢量排序染色體名字

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) 

但我仍然無法得到它。

編輯..... 我有類似的senario,但略顯先進。我有三列的數據幀,名稱,染色體,開始

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)]),]; 
+1

爲什麼不直接使用'chrOrder'?你爲什麼期望'因素'排序你的向量?同樣,'cbind'在這裏沒有效果。 –

+0

我對編輯後的問題期望的結果感到困惑。第三排不在第二排之前是否有錯誤? – blakeoft

+0

它首先按「姓名」排序,然後按「chrom」排序。數字的排序不是自然而然的。它就像1,10,100,2,200,22,299,300 – user1631306

回答

3

你的做法是很好的;你只需要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) 
+0

謝謝,我還有其他問題,我已經編輯了問題 – user1631306

+0

你只需要重新分配你的'鉻'列作爲一個因素與有序的水平。 – Peyton

3

factorcbind沒有做任何事情在這裏(當然,factor做,但它不是立即有用的)。

在你的具體情況下,只是說q <- chrOrder解決了問題,不是嗎?

更一般地,你可以用match來獲得項目的指標由項目在另一個載體y訂購了矢量x

> 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" 

...所以這是一般的方法。舉例來說,作爲一個更有用的例子:

> # 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 

...數據幀列現在下令:假設你確實有基因的data.framechr列,可以按如下順序數據幀的行通過它的chr列以您想要的順序。