咨询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
相关产品推荐
相关产品推荐

