2016-07-03 5 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) 

は、ID列になく、数字に関して内に応じdata.frameを注文することです以下以下のような結果が見えるように、それは(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),] それは辞書順 で結果を順序付け"間違って"次のようになります:

この問題を解決するための滑らかで速いワンライナーはありますか?

+0

@ user2100721「mixedorder」はこれでは機能しません。 – akrun

+0

@deset "ID_"を削除するか、akrunのコードの内側部分を使って新しい変数を作成するのは良い考えです。 – lmo

+0

@Imo yeahあなたは正しいと思いましたが、私はそれも考えましたが、私はずっと長いコードの中でこのIDを使用しています。これは注文が重要な第一歩です。 私はちょうど最初から "ID_"部分を使用すべきではありませんでした... – Deset

答えて

2

我々はnumericに変換、数字以外の文字を削除するためにsubを使用することができますし、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  ! 

\\D+マッチ「ID」列内の1つのより多くのより多くの非数値要素を、我々はと交換''

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

それはちょうど素晴らしい(!)とあなたの答えに感謝します。私はstrsplitと他の部分文字列を使用して2つの異なるソリューションを考え出しました。あなたの答えほど滑らかで洗練されていません。 ちょうどそのIm私は完全に(答えの正規表現の部分のように)理解していないソリューションに少し慎重に。しかし、それは私の個人的な "奇妙な"ものです。とりあえずありがとう! – Deset

+0

@Deset私はいくつかの説明を追加しました。それが役に立てば幸い – akrun