如何使用transmute_if/transmute_at让tibble指定列除以某列
用dplyr的transmute_at/transmute_if实现批量列运算
嘿,这个需求用dplyr的transmute_at或者transmute_if完全能搞定,而且不用硬编码列名,完美匹配你想要的效果!下面给你两种具体的实现方式:
方法一:使用transmute_at(更直接匹配列名)
transmute_at可以让我们针对符合特定名称规则的列批量操作,这里用正则表达式匹配所有以.Length或.Width结尾的列,然后统一除以Petal.Width:
library(dplyr) library(tibble) # 先把iris转成tibble iris_tbl <- as_tibble(iris) # 执行批量除法运算 result_at <- iris_tbl %>% transmute_at( vars(matches("\\.(Length|Width)$")), # 匹配列名规则 ~ . / Petal.Width # 对选中列执行除法 )
解释一下:
matches("\\.(Length|Width)$")是正则匹配:\\.匹配点号,(Length|Width)$匹配结尾是Length或Width的列名,精准选中你需要处理的列~ . / Petal.Width是lambda表达式,.代表当前选中的列,直接实现除以Petal.Width的操作
方法二:使用transmute_if(通过列名条件筛选)
如果你更倾向于用条件判断来筛选列,transmute_if也能实现,我们可以自定义一个判断函数,检查列名是否符合规则:
result_if <- iris_tbl %>% transmute_if( .predicate = function(col) { # 获取当前列的名称 col_name <- deparse(substitute(col)) # 判断列名是否符合结尾规则 grepl("\\.(Length|Width)$", col_name) }, .funs = ~ . / Petal.Width )
解释一下:
.predicate参数是一个判断函数,我们通过deparse(substitute(col))拿到当前列的名称,再用grepl匹配正则规则,符合条件的列才会被处理- 后续的运算逻辑和
transmute_at一致,都是对选中列执行除以Petal.Width的操作
两种方法得到的结果和你想要的iris[,-c(5)]/iris[,4]完全一致,而且不用硬记列名,只要列名符合.Length/.Width的结尾规则,代码就能自动适配~
内容的提问来源于stack exchange,提问作者axiom
相关产品推荐
相关产品推荐

