R语言使用循环从嵌套列表生成T/F布尔值新列的问题求解
问题排查
你编写的循环存在两个核心错误:
- 匹配逻辑错误:
%in%右侧传入的是取值为1/2/3的整数循环变量i,并非你需要匹配的sig_list中存储的转录本ID向量,两类完全不相关的值匹配结果自然全为FALSE。 - 列名命名错误:直接用
paste(i)生成列名,仅会得到数字命名的列,没有保留原有的模型标识名sig_1/sig_2/sig_3。
正确实现
基础R循环版(和你原有写法逻辑最贴合)
不需要修改逻辑框架,仅修正取值和命名逻辑即可,后续新增模型只需更新sig_list,代码无需调整:
for (i in seq_along(sig_list)) { # 取当前模型的名称作为新增列名 cur_colname <- names(sig_list)[i] # 取对应模型的显著转录本列表做匹配 shared_trans[[cur_colname]] <- shared_trans$ensembl_transcript_id %in% sig_list[[i]] }
简洁向量化版(无需显式写循环)
如果习惯用tidyverse语法,可采用更简洁的写法,批量生成所有匹配列:
library(dplyr) shared_trans <- shared_trans %>% mutate(across(all_of(names(sig_list)), ~ensembl_transcript_id %in% sig_list[[cur_column()]]))
两种实现最终得到的结果和你手动逐个添加列的效果完全一致。
内容的提问来源于stack exchange,提问作者Sabrina Arif
相关产品推荐
相关产品推荐

