2016-11-08 75 views
1

我有可以簡化爲如下所示的數據幀的列名的部分匹配進行排序的列(包括在最後的dput):以R:基於與行名稱

T2_KL_21 A1_LC_11 W3_FA_22 RR_BI_12 PL_EW_12 RT_LC_22 YU_BI_21 
FA 1   2   3   4   5   6   7 
BI 1   2   3   4   5   6   7 
KL 1   2   3   4   5   6   7 
EW 1   2   3   4   5   6   7 
LC 1   2   3   4   5   6   7 

我想對列進行排序,以便它們遵循行名稱的順序(基於部分匹配)。然後,它應該是這樣的:

W3_FA_22 RR_BI_12 YU_BI_21 T2_KL_21 PL_EW_12 A1_LC_11 RT_LC_22 
FA 3   4   7   1   5   2   6 
BI 3   4   7   1   5   2   6 
KL 3   4   7   1   5   2   6 
EW 3   4   7   1   5   2   6 
LC 3   4   7   1   5   2   6 

如果不止一個列名中包含的行名的字符串,它們應該保持並排,但順序並不重要。

我已經過濾了列,以便它們都包含行名稱中的匹配項。

這裏是數據幀的dput:

structure(list(T2_KL_21 = c(1L, 1L, 1L, 1L, 1L), A1_LC_11 = c(2L, 
2L, 2L, 2L, 2L), W3_FA_22 = c(3L, 3L, 3L, 3L, 3L), RR_BI_12 = c(4L, 
4L, 4L, 4L, 4L), PL_EW_12 = c(5L, 5L, 5L, 5L, 5L), RT_LC_22 = c(6L, 
6L, 6L, 6L, 6L), YU_BI_21 = c(7L, 7L, 7L, 7L, 7L)), .Names = c("T2_KL_21", 
"A1_LC_11", "W3_FA_22", "RR_BI_12", "PL_EW_12", "RT_LC_22", "YU_BI_21" 
), class = "data.frame", row.names = c("FA", "BI", "KL", "EW", 
"LC")) 

我已經使用pmatch,grep和匹配嘗試過,沒有成功。

任何意見將不勝感激!由於

+0

請您在留言 – akrun

+0

我不提到的更改列名的索引我認爲這不會改變任何事情,我的意思是,行名可以是例如F1A而不是FA,但是對於列名也是如此,所以例如W3_F1A_22,那部分仍然會匹配!對不起,如果我造成任何混淆 – arielle

+0

好吧,我更新了帖子 – akrun

回答

1

我們可以遍歷rownames和grep找到匹配,unlist並用它來安排列

df1[unlist(lapply(gsub("\\d+", "", row.names(df1)), function(x) grep(x, names(df1))))] 
#W3_FA_22 RR_BI_12 YU_BI_21 T2_KL_21 PL_EW_12 A1_LC_11 RT_LC_22 
#FA  3  4  7  1  5  2  6 
#BI  3  4  7  1  5  2  6 
#KL  3  4  7  1  5  2  6 
#EW  3  4  7  1  5  2  6 
#LC  3  4  7  1  5  2  6 
+0

這看起來像是部分工作,它只是保持每行一個匹配,而在這裏有兩個以上的匹配列(請參閱示例輸出表)。 – arielle

+0

我還應該補充說,它應該在排名除字符以外還包含數字的情況下工作 – arielle

+1

這很有效,非常感謝! – arielle