【问题标题】:Order data.frame after numbers within character column in R [duplicate]在R中的字符列中的数字之后订购data.frame [重复]
【发布时间】:2016-11-05 08:51:00
【问题描述】:

我有以下data.frame

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),] 它按字典顺序排列结果 这是“错误的”,如下所示:

     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

有没有流畅快速的单线解决这个问题?

【问题讨论】:

  • @user2100721 mixedorder 无法解决此问题。
  • @deset 完全去掉“ID_”或使用 akrun 代码的内部创建一个新变量可能是个好主意。
  • @Imo 是的,你是对的,我也想过,但是我在更长的代码中使用了这个 ID,这是顺序很重要的第一步。我只是不应该从一开始就使用“ID_”部分......

标签: r dataframe


【解决方案1】:

我们可以用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        !

\\D+ 匹配“ID”列中的另一个非数字元素,我们将其替换为''

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

【讨论】:

  • 它工作得很好(!),感谢您的回答,我想出了两个不同的解决方案,一个使用 strsplit 和另一个子字符串。不像您的答案那么流畅和复杂。只是我对我不完全理解的解决方案有点小心(比如答案的正则表达式部分)。但这只是我个人的“怪癖”。无论如何,谢谢!
  • @Deset 我添加了一些解释。希望对你有帮助
猜你喜欢
  • 2015-02-18
  • 2015-09-29
  • 2021-11-02
  • 1970-01-01
  • 2015-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-05
相关资源
最近更新 更多