如何根据数值向量移除数据框列表中各df的最后指定比例行?
按对应比例移除数据框列表中每个数据框的末尾行
要实现给列表中每个数据框按对应比例删除末尾行,核心是将数据框列表与移除比例向量的元素一一配对处理,不能仅用lapply(仅遍历单个对象),推荐用mapply(基础R)或purrr::map2(tidyverse风格)来同时遍历两个对象。
解决方案1:基础R + dplyr(mapply)
先定义一个接受两个参数的函数:数据框x和对应要移除的末尾比例r,计算需要保留的行数后截取前N行:
library(dplyr) # 定义处理函数 remove_tail <- function(x, r) { # 计算要保留的行数:移除r比例后,保留(1-r)比例,向下取整保证为整数 keep_n <- floor(nrow(x) * (1 - r)) # 截取前keep_n行 x %>% slice(1:keep_n) } # 用mapply配对处理列表和比例向量,SIMPLIFY=FALSE保证返回列表 result_lst <- mapply(remove_tail, lst, removal, SIMPLIFY = FALSE)
验证结果:
# 查看每个结果数据框的行数 sapply(result_lst, nrow) #> [1] 75 70 50
对应df1保留75行(移除25%)、df2保留70行(移除30%)、df3保留50行(移除50%),符合需求。
解决方案2:tidyverse风格(purrr::map2)
如果习惯用tidyverse工具,purrr::map2可以更直观地同时遍历两个对象:
library(purrr) library(dplyr) # 简洁版:用公式语法配对处理 result_lst <- map2(lst, removal, ~ .x %>% slice(1:floor(nrow(.x)*(1-.y))))
为什么之前的代码无法实现需求?
你之前的fake_remv函数依赖全局变量fake_removal,lapply仅遍历数据框列表,无法将每个数据框与removal中的对应比例绑定,导致所有数据框都用同一个固定比例处理。而mapply/map2会自动将lst[i]与removal[i]配对传入函数,实现逐元素的自定义比例处理。
内容的提问来源于stack exchange,提问作者jrcalabrese
相关产品推荐
相关产品推荐

