根据列名部分匹配行名进行排序

4

我可以简化一个数据框,看起来像这样(在末尾包含了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和match,但都没有成功。

非常感谢任何建议!谢谢


请根据您在评论中提到的更改进行修改。 - akrun
我认为这不会改变任何事情,我的意思是行名称可以是例如F1A而不是FA,但列名称也是如此,例如W3_F1A_22,那部分仍然匹配!如果我造成了任何困惑,对不起。 - arielle
好的,我已经更新了帖子。 - akrun
1个回答

4
我们可以通过循环遍历行名并使用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

这看起来部分工作正常,它只保留每行一个匹配项,而这里有两行有多个匹配列(请参见示例输出表)。 - arielle
我还应该补充说明,当行名称除了字符外还包含数字时,它也应该能正常工作。 - arielle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接