R语言批量提取指定变量对应ID及生成UpSet图输入的技术问询
解决批量提取对应ID的问题
你的问题核心出在动态引用列名的方式错误上——当你在lapply里写ds$x时,R会把x当成一个字面量的列名(也就是去查找名为x的列),而不是你循环中传入的前缀字符串。下面是两种可行的解决方案:
方法1:Base R lapply 实现
先修正你的代码,通过paste0拼接出完整的_a列名,再用[[索引数据框的列([[支持字符串索引,这是解决问题的关键):
# 注意:你的数据集里是pho_a而非pro_a,这里修正了前缀列表 ai_list <- c("clo", "man", "pho") # 批量生成每个前缀对应的ID向量 upset_list <- lapply(ai_list, function(prefix) { # 拼接完整的列名,比如clo -> clo_a col_a <- paste0(prefix, "_a") # 提取符合条件的id:列值为"Yes"且排除NA值 ds$id[ds[[col_a]] == "Yes" & !is.na(ds[[col_a]])] }) # 给列表命名,方便后续UpSet图识别组别 names(upset_list) <- ai_list
运行后upset_list的结果完全符合预期:
clo对应的ID:[1] 1 3 5 7 9man对应的ID:[1] 1 2 3 4 5pho对应的ID:[1] 3 8
方法2:用purrr包简化(可选)
如果你习惯tidyverse风格,可以用purrr::map配合公式语法,代码更简洁直观:
library(purrr) ai_list <- c("clo", "man", "pho") upset_list <- set_names( map(ai_list, ~ ds$id[ds[[paste0(.x, "_a")]] == "Yes" & !is.na(ds[[paste0(.x, "_a")]])]), ai_list )
为什么原来的代码返回空值?
ds$x的写法只能引用字面量列名,比如你写ds$clo_a是正确的,但当x是变量时,R不会自动把x的取值替换进去,而是去查找名为x的列——你的数据集里没有这个列,所以返回空值,自然提取不到任何ID。
这个处理后的命名列表可以直接传入UpSet图的函数(比如UpSetR::upset或ComplexUpset::upset),完全满足你的可视化需求。
内容的提问来源于stack exchange,提问作者Philipp Staudacher
相关产品推荐
相关产品推荐

