R语言遍历data.frame行将行值作为命名列表传入自定义函数
批量遍历参数数据框调用自定义函数的实现
前置基础定义
- 定义示例自定义计算函数
foo,入参为a、b,返回b - a的计算结果:
foo <- function(a, b) { b - a }
- 生成包含所有参数组合的输入数据框
input:
input <- rev(expand.grid(b = 1:4, a = 1:4))
该数据框共16行记录,两列分别为a(取值1-4)、b(取值1-4),每行对应一组独立的函数入参组合。
实现方式1:逐行循环遍历(匹配命名列表传参要求)
按照逐行提取参数、以命名列表形式传入函数的逻辑编写:
# 初始化与数据框行数等长的空结果列表 result_loop <- vector("list", nrow(input)) for (row_idx in seq_len(nrow(input))) { # 提取当前行的a、b值,构造为命名列表格式 current_args <- list( a = input$a[row_idx], b = input$b[row_idx] ) # 通过do.call将命名列表传入foo完成计算 result_loop[[row_idx]] <- do.call(foo, current_args) # 为当前结果添加a、b取值的标识标签 names(result_loop)[row_idx] <- paste0("a=", current_args$a, ",b=", current_args$b) }
输出示例:
head(result_loop, 2) # $`a=1,b=1` # [1] 0 # # $`a=1,b=2` # [1] 1
实现方式2:基础R向量化批量传参(无显式循环)
不需要编写逐行循环,用Map直接按列匹配函数形参批量计算:
result_map <- Map(foo, a = input$a, b = input$b) # 为结果补充参数标识标签 names(result_map) <- paste0("a=", input$a, ",b=", input$b)
该方法输出结果与逐行循环完全一致,运行效率更高。
实现方式3:purrr生态管道实现
如果使用tidyverse工作流,可通过pmap完成逐行传参:
library(purrr) result_purrr <- input |> pmap(foo) |> set_names(paste0("a=", input$a, ",b=", input$b))
内容的提问来源于stack exchange,提问作者rnorouzian
相关产品推荐
相关产品推荐

