R语言通过for循环从向量筛选最高总和变量并迭代更新dataframe
R语言循环迭代筛选变量解决方案
核心修改逻辑
你当前代码的问题是所有操作都基于原始数据集my_data执行,没有继承上一轮的处理结果,只需要将操作对象替换为可迭代更新的数据集即可,修改逻辑如下:
- 初始化一个专用的迭代处理数据集,后续所有计算、列筛选操作都在该数据集上执行,不再调用原始数据
- 每轮循环处理完成后直接覆盖更新该迭代数据集,保证下一轮的操作基于上一轮的结果执行
完整可运行代码
# 加载依赖包 library(dplyr) library(purrr) # 构造示例数据,你可以替换为自己的原始数据读取逻辑 my_data <- data.frame( NAMES = c("One", "Two", "THREE", "FOUR", "FIVE", "SIX"), A = 1:6, B = 2:7, C = 3:8, D = 4:9, E = 5:10, F = 6:11 ) # 初始化迭代数据集,所有循环操作都基于该对象更新 processed_data <- my_data # 这里是你每次循环生成vec的逻辑,替换为你自己的vec生成代码即可 # 以下为示例用的vec列表,对应你问题中的三轮循环 vec_list <- list( c("B", "C", "D"), c("A", "E"), c("E", "F") ) for (vec in vec_list) { # 基于当前迭代数据集计算vec内变量的总和,选出总和最高的变量名 selected <- processed_data %>% dplyr::select(all_of(vec)) %>% # 你的原始数据是17行需要删最后一行,取消下一行注释即可,示例数据只有6行无需执行 # slice(-17) %>% purrr::map_dbl(sum) %>% which.max() %>% names() # 更新迭代数据集:删除vec内所有变量,再加回选中的最高总和变量 processed_data <- processed_data %>% dplyr::select(!all_of(vec), all_of(selected)) } # 输出最终结果 print(processed_data)
结果验证
运行上述代码输出的最终结果和你预期一致:
NAMES D F 1 One 4 6 2 Two 5 7 3 THREE 6 8 4 FOUR 7 9 5 FIVE 8 10 6 SIX 9 11
内容的提问来源于stack exchange,提问作者Reda
相关产品推荐
相关产品推荐

