如何用数据框批量输入至R函数并聚合输出?
批量处理团队组合的R语言实现方案
输入数据与现有函数回顾
你的输入数据和函数如下:
# 原始输入数据 input = structure(list(V1 = c("Team_2022", "Team_2022", "Team_2022"), V2 = c("Frank", "Mary", "John"), V3 = c("Sydney", "Sydney", "Sydney"), V4 = c(55, 76, 14)), row.names = c(NA, -3L), class = c("data.table", "data.frame")) # 现有聚合函数 result = function(data, combination) { purrr::map_df(lapply(combination,function(x){paste(x,collapse = '|')}), function(x){ df = data[grepl(x,data$V2),] %>% group_by(V3) %>% summarize(V1= paste(V1[1]), V2= paste(V2,collapse = '+'), V4= sum(V4)) data = df[,c(2,3,1,4)] return(data) } ) } # 目标团队组合数据框 teams = structure(list(V1 = c("team1", "team2"), V2 = c("Mary + Frank","Mary + John")), class = "data.frame", row.names = c(NA, -2L))
解决方案步骤
1. 调整输入变量结构
你的teams数据框里的组合是字符串格式(如"Mary + Frank"),需要先转换成函数要求的列表格式(每个元素是对应团队的成员字符向量):
# 将字符串拆分并转换成列表 team_combinations <- lapply(strsplit(teams$V2, " + "), function(x) x) # 转换后结构:list(c("Mary","Frank"), c("Mary","John"))
2. 批量生成结果(两种方式)
方式一:直接调用现有函数(最简洁)
因为转换后的team_combinations正好符合result函数的combination参数要求,直接传入即可一次性得到合并后的结果:
output <- result(input, team_combinations)
方式二:用for循环实现
如果你更习惯循环逻辑,也可以初始化空数据框,循环处理每个组合并合并:
# 初始化空数据框 output <- data.frame() # 循环遍历每个团队组合 for (comb in team_combinations) { # 调用函数处理单个组合,注意要把comb包装成列表 temp <- result(input, list(comb)) # 合并结果 output <- rbind(output, temp) }
函数优化建议(可选)
原函数用grepl匹配成员可能存在误匹配风险(比如名字包含目标字符串的情况),建议改用%in%精准匹配,同时简化代码逻辑:
result <- function(data, combination) { purrr::map_df(combination, function(members) { data %>% dplyr::filter(V2 %in% members) %>% dplyr::group_by(V3) %>% dplyr::summarize( V1 = dplyr::first(V1), V2 = paste(V2, collapse = "+"), V4 = sum(V4) ) %>% dplyr::select(V1, V2, V3, V4) # 直接指定列顺序,避免索引出错 }) }
内容的提问来源于stack exchange,提问作者alice_hooper
相关产品推荐
相关产品推荐

