2016-09-23 63 views
1

我有数据集,其具有以下的列名:重新排序列由多个嵌入在他们的名字

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 

我想在下面显示的方式colnames重新排列列,即按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 

我试图解决相同的使用顺序和substr函数,但没有得到解决方案。

回答

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 
1

我们可以使用mixedordergtoolsorder

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 
+0

@Sotos我以为OP想根据整个字符串进行排序。无论如何,更新。 – akrun

0

另一个base 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 
+1

使用'尾巴,1'而不是'[[,3',即'lapply(strsplit(names(df),“_”),tail,1)'' – Sotos

+0

@Sotos似乎更安全@Sotos这是另一种方法但我认为效率并不高。我跳过这一步,看看我的更新。 – 989

+1

这不是关于效率,而是为了安全。如果其中一个名称是“X50_TT_RS_1.1”,那么它将失败。 – Sotos