如何根据另一个列表中数据框行数筛选R语言列表内的数据框
解决列表对应数据框的筛选问题
你需要同时遍历list1和list2两个等长对应列表,对list1中的每个数据框,筛选出freq列值大于list2中同名数据框行数的行,以下是可行的解决方法:
方法1:使用mapply
mapply支持同时遍历多个等长列表,传入对应位置的元素进行处理,注意设置SIMPLIFY = FALSE确保返回结果为列表格式:
list3 <- mapply(function(x, y) { # x为list1中的单个数据框,y为list2中对应位置的同名数据框 x[x$freq > nrow(y), ] }, list1, list2, SIMPLIFY = FALSE)
方法2:使用Map
Map是mapply的简化版本,默认不会简化结果,写法更简洁:
list3 <- Map(function(x, y) x[x$freq > nrow(y), ], list1, list2)
方法3:使用purrr包的map2(tidyverse风格)
如果你习惯用tidyverse工具链,可以用purrr::map2实现:
library(purrr) list3 <- map2(list1, list2, ~ .x[.x$freq > nrow(.y), ])
你之前代码的问题
lapply仅能遍历单个列表,无法同时获取list2中对应位置的元素,因此无法拿到每个对应数据框的行数;list2$x写法错误:这里的x是函数参数(list1中的单个数据框),并非list2的元素名称,无法定位到list2中的对应数据框。
运行上述代码后,list3的结构和内容与你给出的期望结果完全一致。
内容的提问来源于stack exchange,提问作者user2299015
相关产品推荐
相关产品推荐

