2016-07-03 2 views
0

У меня есть следующие data.frameЗаказать data.frame после номера внутри символьного столбца в R

ID<-c("ID_1","ID_2","ID_3","ID_5","ID_1008","ID_6","ID_10") 
SomethingElse<-c(5,6,7,1,2,3,1) 
SomeText<-c("Thank","you","for","the","!","help","!") 
df<-data.frame(ID,SomethingElse,SomeText) 

то, что мне нужно, чтобы заказать data.frame по столбцу ID, но в отношении чисел в она (1,2,3,5,1008,6,10), так что результат выглядит следующим образом:

ID SomethingElse SomeText 
    ID_1    5 Thank 
    ID_2    6  you 
    ID_3    7  for 
    ID_5    1  the 
    ID_6    3  help 
    ID_10    1  ! 
ID_1008    2  ! 

Моя проблема при использовании команды df[order(df$ID),] упорядочивает результат в лексикографическом порядке , который «неправильный» и выглядит следующим образом:

 ID SomethingElse SomeText 
    ID_1    5 Thank 
    ID_10    1  ! 
ID_1008    2  ! 
    ID_2    6  you 
    ID_3    7  for 
    ID_5    1  the 
    ID_6    3  help 

Есть ли гладкие и быстрые однострочные решения для решения этой проблемы?

+0

@ пользователь2100721 ​​'mixedorder' не будет работать над этим. – akrun

+0

@deset Вероятно, это хорошая идея полностью удалить «ID_» или создать новую переменную, используя внутреннюю часть кода akrun. – lmo

+0

@ И если вы правы, я тоже об этом подумал, но я использую эти идентификаторы во всем более длинном коде, и это первый шаг, когда порядок имеет значение. Я просто не должен был использовать часть «ID_» с самого начала ... – Deset

ответ

2

Мы можем использовать sub для удаления нечисловых символов, конвертировать в numeric и order это

df[order(as.numeric(sub("\\D+", "", df$ID))),] 
#  ID SomethingElse SomeText 
#1 ID_1    5 Thank 
#2 ID_2    6  you 
#3 ID_3    7  for 
#4 ID_5    1  the 
#6 ID_6    3  help 
#7 ID_10    1  ! 
#5 ID_1008    2  ! 

The \\D+ спичек еще один более нецифровых элементов в столбце «ID» и заменить его ''

sub("\\D+", "", df$ID) 
#[1] "1" "2" "3" "5" "1008" "6" "10" 
+0

Он работает просто отлично (!), И благодаря вашему ответу я придумал два разных решения, используя strsplit и другую подстроку. Не такой гладкий и сложный, как ваш ответ. Его просто то, что я немного осторожен с решениями, которые я не понимаю полностью (например, часть регулярного выражения ответа). Но это только моя личная «причуда». В любом случае, спасибо! – Deset

+0

@Deset Я добавил несколько объяснений. Надеюсь, поможет – akrun

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