如何基于参数DataFrame为多个DataFrame计算新增列值?
实现方法
前提说明
假设你有一个存储所有待处理DataFrame的列表(比如命名为df_list),每个元素都是你描述的结构;参数DataFrame命名为param_df。另外注意:你提供的自定义函数里的s参数,在param_df中未找到对应列,这里默认用param_df里的p列替代,若实际为其他列可自行替换。
步骤1:修正自定义函数
先优化函数格式并添加基础校验(避免计算错误):
test <- function(s, r, t, m, n, a) { # 校验t不能小于等于r,防止计算报错 if (any(t <= r)) stop("t的值不能小于等于r,请检查数据") (((((s - r)/(t - r))^(1/m) - 1)^(1/n))/a) }
步骤2:批量处理DataFrame
根据参数匹配方式分两种场景:
场景1:按顺序一一对应参数行
如果待处理DataFrame列表的元素顺序,和param_df的行顺序完全对应(比如第1个df对应param_df第1行参数),可以用循环或purrr批量处理:
基础循环写法
for (i in seq_along(df_list)) { # 取出对应行的参数 params <- param_df[i, ] # 计算并添加新列 df_list[[i]]$calc_result <- test( s = params$p, r = params$r, t = df_list[[i]]$t, m = params$m, n = params$n, a = params$a ) }
purrr简洁写法
先加载purrr包:
library(purrr) df_list <- map2(df_list, split(param_df, seq(nrow(param_df))), function(df, param_row) { df$calc_result <- test( s = param_row$p, r = param_row$r, t = df$t, m = param_row$m, n = param_row$n, a = param_row$a ) return(df) })
场景2:按标识匹配参数行
如果待处理DataFrame有Area/Sites/Plot/depth这类标识列(和param_df的对应列匹配),可以通过标识精准匹配参数:
# 先给每个待处理DataFrame添加标识列(示例:第一个df对应指定组合) df_list[[1]]$Area <- "TB" df_list[[1]]$Sites <- "C" df_list[[1]]$Plot <- "num" df_list[[1]]$depth <- 10 # 批量匹配并计算 df_list <- map(df_list, function(df) { # 匹配对应参数行 param_row <- param_df[ param_df$Area == df$Area[1] & param_df$Sites == df$Sites[1] & param_df$Plot == df$Plot[1] & param_df$depth == df$depth[1], ] # 添加计算列 df$calc_result <- test( s = param_row$p, r = param_row$r, t = df$t, m = param_row$m, n = param_row$n, a = param_row$a ) return(df) })
内容的提问来源于stack exchange,提问作者julleber
相关产品推荐
相关产品推荐

