如何使用tidyverse的mutate函数结合自定义函数批量创建多列
实现方法
你的核心需求是仅执行一次耗时的公共计算逻辑,同时返回多列结果,只需要修正自定义函数的语法,再配合对应赋值逻辑即可实现。
修正自定义函数
你编写的函数存在R语法错误,return后需要用括号包裹返回内容,你可以选择在函数内为返回的列表元素命名,方便直接生成对应列名:
calculates <- function(a, b){ # 此处的公共计算逻辑(如示例的mean)仅会执行一次 e_a <- mean(a) return(list( diff_a = a - e_a, diff_b = b - e_a )) }
调用方法
dplyr写法(推荐)
直接在mutate中调用函数即可,函数返回的命名列表会自动拆分为独立列:
library(dplyr) # 初始数据框 df = data.frame(a = c(1,2,3), b = c(6,7,8)) # 调用函数生成结果 df_result <- df %>% mutate(calculates(a, b))
运行后得到的结果如下:
| a | b | diff_a | diff_b |
|---|---|---|---|
| 1 | 6 | -1 | 4 |
| 2 | 7 | 0 | 5 |
| 3 | 8 | 1 | 6 |
注:你提供的示例结果中b列取值和初始数据框的b列不一致属于笔误,上述代码逻辑完全符合你的计算规则。
如果你需要复用函数,不想在函数内部定义输出列名,也可以在调用时指定列名:
calculates <- function(a, b){ e_a <- mean(a) return(list(a - e_a, b - e_a)) } df_result <- df %>% mutate(c("diff_a", "diff_b") := calculates(a, b))
基础R写法
如果你不使用dplyr,也可以用基础R的赋值方式实现:
df = data.frame(a = c(1,2,3), b = c(6,7,8)) calculates <- function(a, b){ e_a <- mean(a) return(list(a - e_a, b - e_a)) } df[,c("diff_a", "diff_b")] <- calculates(df$a, df$b)
内容的提问来源于stack exchange,提问作者Leo Q
相关产品推荐
相关产品推荐

