2016-09-23 69 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