按列名中嵌入的数字对列重新排序

时间:2016-09-23 09:59:50

标签: r dataframe

我的数据集包含以下列名称:

df

X100_TT_7.1  X50_TT_1.1  X60_TT_2.1  X80_TT_4.1  X70_TT_3.1  X85_FTT_5.1  X90_TT_6.1
    0.08        0.06        0.84        0.95        0.89        0.91        0.86

我想以下面的方式重新排列列,即按照1.1到7.1的列号:

df

X50_TT_1.1  X60_TT_2.1  X70_TT_3.1  X80_TT_4.1  X85_FTT_5.1 X90_TT_6.1  X100_TT_7.1
0.06          0.84        0.89        0.95        0.91        0.86          0.08

我试图使用order和substr函数解决相同问题,但没有得到解决方案。

3 个答案:

答案 0 :(得分:1)

我们可以使用mixedordergtools列的order

library(gtools)
df1 <- df[mixedorder(names(df))]
df1
#     X50_TT_1.1 X60_TT_2.1 X70_TT_3.1 X80_TT_4.1 X85_FTT_5.1 X90_TT_6.1 X100_TT_7.1
#1       0.06       0.84       0.89       0.95        0.91       0.86        0.08

或者它仅基于浮点数

df[order(as.numeric( sub(".*_", "", names(df))))]
#  X50_TT_1.1 X60_TT_2.1 X70_TT_3.1 X80_TT_4.1 X85_FTT_5.1 X90_TT_6.1 X100_TT_7.1
#1       0.06       0.84       0.89       0.95        0.91       0.86        0.08

答案 1 :(得分:1)

通过基地R,

df[order(sub("^.*(.*)_", "\\1", names(df)))]
#  X50_TT_1.1 X60_TT_2.1 X70_TT_3.1 X80_TT_4.1 X85_FTT_5.1 X90_TT_6.1 X100_TT_7.1
#1       0.06       0.84       0.89       0.95        0.91       0.86        0.08

答案 2 :(得分:0)

另一个基础R尝试:

df[,order(as.numeric(lapply(strsplit(names(df),"_"),tail,1)))]

#  X50_TT_1.1 X60_TT_2.1 X70_TT_3.1 X80_TT_4.1 X85_FTT_5.1 X90_TT_6.1 X100_TT_7.1
#1       0.06       0.84       0.89       0.95        0.91       0.86        0.08