我有一个巨大的数据,我无法在这里上传,因为。
我有两种类型的列,其名称以T.H.L
或T.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:
答案 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])]
你应该完成。