如何在R中对数据框每行应用带额外数据框参数的函数并生成多列
解决R中向每行传入多参数并返回多列的问题
核心思路
要给output1的每一行传入site_code、analyte_code和大型数据框output2,并将函数返回的多列追加到原数据框,**purrr::pmap**或dplyr::rowwise都能实现,关键是让函数返回结构化结果(如列表或单行tibble),而非矩阵。
修正函数
先调整find_sample_gaps函数,让它返回单行tibble,方便后续直接展开为列:
library(tidyverse) find_sample_gaps <- function(site, analyte, df) { Sample <- df %>% filter(site_code == site, analyte_code == analyte) %>% mutate(Year = as.numeric(format(Date, '%Y'))) # 处理无匹配数据的情况,避免报错 if(nrow(Sample) == 0) { return(tibble(a = 0, b = 0, c = "No data found")) } x <- Sample %>% group_by(Year) %>% summarize(n_samples = n(), .groups = "drop") gaps <- which(c(1, diff(x$Year)) > 1) a <- sum(x$n_samples) b <- n_distinct(Sample$Date) c <- 'No gaps' if(length(gaps) > 0){ # 若要显示具体gap位置,可改为paste(gaps, collapse=", ") c <- paste('There are', length(gaps), 'gaps') } return(tibble(a, b, c)) }
方法1:使用purrr::pmap
构造参数列表后,用pmap_dfr批量处理并合并结果:
# 构造每行对应的参数:site、analyte、重复的output2 params <- list( site = output1$site_code, analyte = output1$analyte_code, df = rep(list(output2), nrow(output1)) ) # 批量处理得到结果数据框 result_df <- pmap_dfr(params, find_sample_gaps) # 合并原数据框与结果 final_result <- bind_cols(output1, result_df)
方法2:使用dplyr::rowwise(更直观)
用rowwise逐行处理,逻辑更清晰:
final_result <- output1 %>% rowwise() %>% mutate( # 调用函数后自动拆分返回的tibble为列 find_sample_gaps(site_code, analyte_code, output2) ) %>% ungroup() # 取消行分组,恢复常规数据框操作
原代码报错原因
- 直接调用函数时,把整个向量传给
site和analyte,而非逐行处理,导致逻辑错误。 sapply用法错误:将三个参数拼成向量传入,函数无法同时接收三个参数。
内容的提问来源于stack exchange,提问作者Ryan
相关产品推荐
相关产品推荐

