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

咨询dplyr中select_at、mutate_at等verb_at系列函数的适用场景

何时使用select_at、mutate_at等_at系列函数?

嘿,我来帮你把dplyr里_at系列函数的使用场景说清楚,毕竟我平时处理数据时经常用到这些,举几个实际例子你就秒懂啦!

简单来说,_at系列函数的核心特点是精准指定你要操作的列集合——不管是直接列名、字符向量,还是通过列名匹配规则(比如starts_with())筛选,都能精准定位目标列,和_all(操作所有列)、_if(操作满足条件的列)形成互补。

1. select_at:精准挑选或批量重命名列

这个函数适合两种核心场景:

  • 场景1:按列名规则批量挑选列,比如提取所有带特定前缀/后缀的列
    比如你有天气数据,列名是date, temp_morning, temp_afternoon, temp_night, humidity,想一次性选出所有温度相关的列,同时去掉temp_前缀:
    library(dplyr)
    library(stringr)
    weather_data %>%
      select_at(vars(starts_with("temp")), ~ str_remove(., "temp_"))
    
  • 场景2:排除特定列,保留其余列
    比如要去掉date和humidity,保留剩下的所有列:
    weather_data %>%
      select_at(vars(-date, -humidity))
    

2. mutate_at:对指定列批量做数据变换

这是_at系列里最常用的函数,应用场景非常多:

  • 场景1:对特定数值列做标准化处理
    比如学生成绩数据里,只想给math, english, science三科成绩做z-score标准化:
    student_scores %>%
      mutate_at(vars(math, english, science), ~ (.-mean(., na.rm = TRUE))/sd(., na.rm = TRUE))
    
  • 场景2:批量转换列类型
    比如把gender, city, occupation这几个字符列统一转成因子:
    user_data %>%
      mutate_at(vars(gender, city, occupation), as.factor)
    
  • 场景3:对匹配列名规则的列做统一运算
    比如所有以count_开头的列都加1:
    sales_data %>%
      mutate_at(vars(starts_with("count")), ~ . + 1)
    

3. rename_at:批量重命名指定列

当你需要统一修改一批列的名称时,这个函数超好用:

  • 场景:去掉所有product_前缀的列名,比如把product_price改成price,product_quantity改成quantity:
    sales_data %>%
      rename_at(vars(starts_with("product")), ~ str_remove(., "product_"))
    
    或者给所有数值列加_num后缀:
    sales_data %>%
      rename_at(vars(where(is.numeric)), ~ paste0(., "_num"))
    

4. summarise_at:对指定列批量做汇总统计

如果你只想对特定列计算统计量,而不是所有列,就用它:

  • 场景:计算所有温度列的平均值:
    weather_data %>%
      summarise_at(vars(starts_with("temp")), mean, na.rm = TRUE)
    
    还能同时计算多个统计量,比如均值和最大值:
    weather_data %>%
      summarise_at(vars(starts_with("temp")), list(avg = mean, max = max), na.rm = TRUE)
    

和_if、_all的区别快速梳理

最后再帮你区分下这三个系列的核心差异:

  • _all:操作所有列,适合全列统一处理(比如把所有列转成字符串:mutate_all(as.character))
  • _if:操作满足条件的列,比如对所有数值列做标准化:mutate_if(is.numeric, ~ scale(.))
  • _at:操作你明确指定的列,不管列类型,精准可控,这是它独有的优势

另外提一句:dplyr 1.0.0之后官方推荐用across()来替代这些旧的系列函数,比如mutate(across(vars(math, english), ~ scale(.))),逻辑是一样的,但写法更统一,不过旧的_at函数目前仍然可用,完全不用担心兼容性问题。

内容的提问来源于stack exchange,提问作者deann

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:54:49