R语言:在嵌套列表中筛选全为TRUE的案例
找出嵌套列表中三元素全为TRUE的子项位置
我们需要从多层嵌套列表里筛选出所有包含三个"TRUE"字符串的子向量,并返回它们在原结构中的位置(格式如l2[[1]])。
示例数据
l1 <- list( c("TRUE","FALSE","FALSE") , c("FALSE","FALSE","FALSE") , c("FALSE","FALSE","FALSE") ) l2 <- list( c("TRUE","TRUE","TRUE") , c("TRUE","TRUE","TRUE") , c("FALSE","FALSE","FALSE") ) l3 <- list( c("TRUE","TRUE","TRUE") , c("FALSE","FALSE","FALSE") , c("TRUE","FALSE","FALSE") ) mylist <- list(l1,l2,l3)
解决方案1:基础循环实现
用两层循环遍历嵌套结构,逐一判断每个子向量是否符合条件,生成对应的位置字符串:
result <- character(0) # 外层遍历mylist的一级元素(对应l1、l2、l3) for (main_idx in seq_along(mylist)) { sub_list <- mylist[[main_idx]] # 内层遍历每个一级元素下的子列表 for (sub_idx in seq_along(sub_list)) { current_vec <- sub_list[[sub_idx]] # 判断三个元素是否全为"TRUE" if (all(current_vec == "TRUE")) { pos_str <- paste0("l", main_idx, "[[", sub_idx, "]]") result <- c(result, pos_str) } } } # 输出结果 result
运行后输出:
[1] "l2[[1]]" "l2[[2]]" "l3[[1]]"
解决方案2:purrr包简洁实现
如果习惯用tidyverse风格的函数,可以用purrr::imap遍历并保留索引,写法更简洁:
library(purrr) result <- imap(mylist, function(sub_list, main_idx) { imap(sub_list, function(vec, sub_idx) { if (all(vec == "TRUE")) { paste0("l", main_idx, "[[", sub_idx, "]]") } }) }) %>% flatten() %>% # 展平嵌套列表 discard(is.null()) # 移除不符合条件的空值 result
注意事项
示例数据中的TRUE/FALSE是字符串类型,所以判断时用current_vec == "TRUE";如果你的实际数据是逻辑型(即TRUE/FALSE不带引号),直接用all(current_vec)即可。
内容的提问来源于stack exchange,提问作者Stefanie Richters
相关产品推荐
相关产品推荐

