根据字符串部分中的数字对字符串进行排序

时间:2016-06-27 20:11:03

标签: r

我有一个巨大的数据,我无法在这里上传,因为。

我有两种类型的列,其名称以T.H.LT.H.L.varies....开头。两种类型都以So####格式编号,例如T.H.L.So1_P1_A2,直到T.H.L.So10000_P1_A2

对于每个T.H.L列,都有一个名为T.H.L.varies....的列,其结尾相同。

我想按So之后的数字排序列,首先是T.H.L,然后是每个T.H.L.varies....数字的相应So版本。

我尝试做的是

library(gtools) 
mySorted<- df2[,mixedorder(colnames(df2))]

哪个接近,它会按数字正确排序,但首先是T.H.L,然后是所有T.H.L.varies而不是交替它们。

我已将列名发布到Github:

1 个答案:

答案 0 :(得分:1)

好的,让我们调用您的数据框的名称(您要重新排序的名称)x

x = names(df2)

# first remove the ones without numbers
# because we want to use the numbers for ordering
no_numbers = c("T.H.L", "T.H.L.varies....")
x = x[! x %in% no_numbers]

# now extract the numbers so we can order them
library(stringr)
x_num = as.numeric(str_extract(string = x, pattern = "(?<=So)[0-9]+"))

# calculate the order first by number, then alphabetically to break ties
ord = order(x_num, x)

# verify it is working
head(c(no_numbers, x[ord]), 10)
#  [1] "T.H.L"                      "T.H.L.varies...."           "T.H.L.So1_P1_A1"           
#  [4] "T.H.L.varies.....So1_P1_A1" "T.H.L.So2_P1_A2"            "T.H.L.varies.....So2_P1_A2"
#  [7] "T.H.L.So3_P1_A3"            "T.H.L.varies.....So3_P1_A3" "T.H.L.So4_P1_A4"           
# [10] "T.H.L.varies.....So4_P1_A4"

# finally, reorder your data frame columns
df2 = df2[, c(no_numbers, x[ord])]

你应该完成。