R语言中如何基于另一列表元素名称筛选列表并保留匹配项
筛选R列表:保留与目标列表同名的元素
问题背景
现有两个存储Reddit用户数据的列表:
list_map_descr:包含4570个元素,每个元素是含subreddit和date_utc列的data.framelist_map_date_o_2_1:经过过滤的分析列表,包含2132个元素,每个元素是含4列的data.frame
两个列表共享部分元素名称,需要从list_map_descr中保留所有名称与list_map_date_o_2_1一致的元素,最终得到一个2132元素的列表(结构与原list_map_descr的对应元素完全一致)。
尝试过的无效方法
曾尝试多种基于filter/keep/lapply的方法,但均未生效(错误在于操作对象为data.frame内容,而非列表元素名称):
words <- as.list(names(list_map_date_o_2_1)) list_map_descr_test_3 <- map(list_map_descr, ~filter(words %in% .x)) list_map_descr_test_2 <- map(list_map_descr, ~ filter(.x, .x %in% words)) list_map_descr_test_2 <- map(list_map_descr, ~ keep(any(.x %in% words == TRUE))) list_map_descr_test_2 <- mapply(function(x, y) x %in% y, list_map_descr, words, SIMPLIFY=FALSE) list_map_descr_test_2 <- lapply(function(x, y) x %in% y, list_map_descr, words, SIMPLIFY=FALSE) list_map_descr_test_2 <- purrr::keep(list_map_descr, ~.x %in% words == TRUE)
正确解决方案
核心思路是基于列表的顶层元素名称进行筛选,而非操作每个data.frame的内容:
方法1:基础R(最简洁高效)
直接利用列表的名称索引特性提取目标元素:
# 获取目标列表的元素名称向量 target_names <- names(list_map_date_o_2_1) # 从原列表中保留同名元素 list_map_descr_filtered <- list_map_descr[target_names]
方法2:使用purrr包
如果习惯tidyverse风格,可使用purrr::keep筛选:
library(purrr) # 筛选元素名称存在于目标列表中的元素 list_map_descr_filtered <- keep(list_map_descr, names(.) %in% names(list_map_date_o_2_1))
验证结果:运行后str(list_map_descr_filtered)会输出与预期一致的2132元素列表,每个元素的data.frame结构与原list_map_descr对应元素完全相同。
内容的提问来源于stack exchange,提问作者LuCama
相关产品推荐
相关产品推荐

