如何在R中筛选薪资和≥2000万的组合并生成含姓名的DataFrame
解决方案
针对你的需求,我们可以生成所有非空的员工子集,计算每个子集的薪资总和,再筛选出总和达标(≥20000000)的组合,最终整理成目标DataFrame。以下是具体实现代码:
示例代码
首先构造你的示例数据:
library(dplyr) library(tidyr) # 构造示例DataFrame df <- tibble( Name = paste0("Name ", 1:5), Salary = c(5000000, 7000000, 9000000, 12000000, 14000000) )
然后生成所有符合条件的组合:
target <- 20000000 n <- nrow(df) # 生成所有非空子集的索引(从1个元素到n个元素的组合) all_combinations <- lapply(1:n, function(m) combn(seq_len(n), m, simplify = FALSE)) %>% unlist(recursive = FALSE) # 处理每个子集,提取姓名、计算薪资总和 result_list <- lapply(all_combinations, function(idx) { subset <- df[idx, ] tibble( Name_Combination = paste(subset$Name, collapse = ", "), Total_Salary = sum(subset$Salary) ) }) # 合并成DataFrame并筛选达标组合 result_df <- bind_rows(result_list) %>% filter(Total_Salary >= target) %>% arrange(Total_Salary) # 查看结果 print(result_df)
代码说明
- 用
lapply+combn生成所有长度的非空子集,解决了combn只能指定固定长度的问题; - 对每个子集,拼接姓名成字符串、计算总薪资;
- 最后筛选出总薪资≥目标值的组合,还可以按总薪资排序方便查看;
- 对于12-15条数据的情况,总子集数是
2^15 -1 = 32767,这个量级在R中完全可以处理,30个DataFrame也能批量循环处理。
批量处理30个DataFrame的思路
如果你的30个DataFrame是放在列表里(比如df_list),可以用lapply批量处理:
df_list <- list(df1, df2, ..., df30) # 假设这是你的30个DataFrame列表 batch_result <- lapply(df_list, function(df) { n <- nrow(df) all_combinations <- lapply(1:n, function(m) combn(seq_len(n), m, simplify = FALSE)) %>% unlist(recursive = FALSE) result_list <- lapply(all_combinations, function(idx) { subset <- df[idx, ] tibble( Name_Combination = paste(subset$Name, collapse = ", "), Total_Salary = sum(subset$Salary) ) }) bind_rows(result_list) %>% filter(Total_Salary >= target) %>% arrange(Total_Salary) }) # 每个元素对应一个原DataFrame的结果 names(batch_result) <- paste0("Result_", 1:30)
内容的提问来源于stack exchange,提问作者ColinM
相关产品推荐
相关产品推荐

