2016-11-08 2 views
1

と列名の部分一致に基づいて列を並べ替え:R:私はこの(終わりにdputを含む)のように見えるように簡略化することができるデータフレーム有する行名

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

Iドンで述べた変更を行ってください列を配置することを使用して列名のインデックスを検索することができますそれが何か変わると思っていたのですが、行名はFAの代わりにF1Aのようなものでしたが、それは列名にも当てはまります。 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

これは部分的に動作しているようですが、行ごとに1つの一致を保持していますが、 )。 – arielle

+0

また、行の名前にも文字に加えて数字が含まれている場合にも動作するようにしてください。 – arielle

+1

これはうまくいきました。 – arielle

関連する問題