2015-06-26 2 views
1

У меня есть следующие data.frame "тест":Я пытаюсь сортировать хромосомные аберрации по cytoband

Cytoband 
9p 
1q 
10p 
22p 
2q 

Я хочу, чтобы получить:

Cytoband 
1q 
2q 
9p 
10p 
22p 

Вот мой код:

indices <- order(test$Cytoband, decreasing = FALSE) 
test <- test[indices,] 

Но я получаю:

10p 
1q 
22p 
2q 
9p 

Есть ли простая модификация? Спасибо!

ответ

2

Вы также можете попробовать использовать mixedsort или mixedorder

library(gtools) 
out = data.frame(Cytoband = mixedsort(dat$Cytoband)) 

#> out 
# Cytoband 
#1  1q 
#2  2q 
#3  9p 
#4  10p 
#5  22p 

Использование mixedorder

dat[mixedorder(as.character(dat$Cytoband)),] 
+1

Большое спасибо! Я также использовал смешанный заказ, чтобы продлить его! – Johnathan

5
x = c("9p","1q","10p","22p","2q") 

y = x[order(as.numeric(gsub("\\D","",x)))] 
y 

[1] "1q" "2q" "9p" "10p" "22p" 
+0

Johnathan в случае, если не ясно, что здесь происходит, он использует 'gsub' для извлечения только цифры из данных, которые затем можно упорядочить численно. Он не работал на вас, потому что вы пытались заказать строки. –

+0

Dr. Mantis Tobaggan Спасибо! По сути, он принимает все нечисловые символы, преобразует их в нуль, а затем преобразует оставшуюся строку в числовую. – Johnathan

+0

Алексей Ферапонтов Спасибо за ваш вклад! – Johnathan

1
test[order(as.numeric(gsub('(\\d+)[a-z]*', '\\1', test[,1]))),, drop=F] 
    Cytoband 
2  1q 
5  2q 
1  9p 
3  10p 
4  22p 
Смежные вопросы