R:基于列名与行名

时间:2016-11-08 15:39:31

标签: 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

如果多个列名包含行名中的字符串,则应将它们并排放置,但顺序无关紧要。

我已经过滤了列,因此它们都包含行名称中的匹配项。

以下是数据框的输入:

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和match,但没有成功。

任何建议将不胜感激!感谢

1 个答案:

答案 0 :(得分:3)

我们可以遍历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