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)

しかし、それでも私はそれを得ることができませんでした。

編集..... 私は同様のシナリオを持っていますが、少し進んでいます。名前、染色体、開始の 3 つの列のデータ フレームがあります。

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

2 に答える 2

3

あなたのアプローチは良いです。sort結果の要因が必要なだけです。次も設定する必要がありますordered=TRUE

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

いいえ、指摘されているように順序付けられた要素を使用する必要はありませんが、それは確かに間違っているわけではなく、間違いなく優れています。要因は、レベルが明確に定義されているこのタイプの状況に適しています。vsに関するこの前の質問をfactorcharacter参照してください。

質問を編集したので、並べ替えが単純であるため、要因のケースはさらに強力です。

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)
于 2013-09-25T20:29:26.890 に答える
3

factorcbindここでは何もしないでください (そうしますがfactor、すぐには役に立ちません)。

あなたの特定のケースでは、言うだけq <- chrOrderで問題が解決しますね。

より一般的には、別の vector 内の項目によって順序付けられmatchた vector 内の項目のインデックスを取得するために使用できます。xy

> 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希望する順序で列ごとに並べ替えられます。

于 2013-09-25T20:34:10.740 に答える