2013-09-25 3 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) 

Но все же я не смог его получить.

Отредактировано ..... У меня есть аналогичный сенарио, но слабо развит. У меня есть кадр данных из трех столбцов, имя, хромосома, начало

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

Сортируется по первому «имени», затем «хром». где сортировка числа не происходит естественным образом. Его как 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

Вам просто нужно переписать свой столбец 'chrom' как фактор с упорядоченными уровнями. – Peyton

3

factor и cbind ничего не делать здесь (ну, factor делает , но это не сразу полезно).

В вашем конкретном случае, просто говоря, q <- 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 в желаемом порядке.

Смежные вопросы