You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 15:15:23