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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:26:33