如何用Tidyverse风格按列名后缀重新排序R数据框列
问题描述
我有一个大型dataframe,以下是其片段:
dput(MyData) structure(list(Frui1_Trea4_Ty4_0d = c(10L, 4L, 28L, 147L, 6L), Frui1_Trea4_Ty4_14d = c(18L, 0L, 26L, 70L, 27L), Frui1_Trea4_Ty8_0d = c(9L, 1L, 21L, 168L, 6L), Frui1_Trea4_Ty8_14d = c(19L, 0L, 58L, 74L, 10L), Frui2_Trea4_Ty4_0d = c(40L, 6L, 39L, 141L, 15L), Frui2_Trea4_Ty4_14d = c(74L, 1L, 91L, 24L, 8L), Frui2_Trea4_Ty8_0d = c(22L, 0L, 50L, 54L, 17L), Frui2_Trea4_Ty8_14d = c(80L, 0L, 43L, 65L, 9L)), row.names = c("MTC88", "MTND2P28", "MTCO1P12", "MTATP6P1", "MTCO3P12"), class = "data.frame")
其余列也遵循相同命名逻辑。我希望重新排序列,将所有以"_0d"结尾的列放在dataframe开头,以"_14d"结尾的列放在末尾。
我尝试过:
MyData %>% dplyr::select(sort(names(.)))
该代码可实现字母排序,但尝试如下代码时出现错误:
MyData %>% dplyr::select(names(stringr::str_sort("d0", "d7")))
我认为可以用select(contains(.))实现,但未能成功。求助符合Tidyverse风格的解决方案,后续还要进行过滤分析。
解决方案
使用dplyr::select()结合ends_with()函数即可精准实现需求,完全符合Tidyverse风格:
library(dplyr) # 先筛选所有以_0d结尾的列,再筛选所有以_14d结尾的列 MyData_reordered <- MyData %>% select(ends_with("_0d"), ends_with("_14d"))
补充说明
ends_with()函数会精准匹配列名末尾符合指定字符串的列,完全适配你的列命名逻辑;- 该方法会保留同后缀列在原数据中的原有顺序,无需额外调整;
- 重排后的dataframe可以直接链式调用其他Tidyverse函数(如
filter()、mutate()等),满足后续过滤分析需求。
如果需要让同后缀列内部按字母排序,可调整代码如下:
MyData_reordered_sorted <- MyData %>% select(sort(ends_with("_0d")), sort(ends_with("_14d")))
内容的提问来源于stack exchange,提问作者MEC
相关产品推荐
相关产品推荐

