基于probeID匹配coMeth_ls的cg*项筛选数据框返回空值求助
问题排查:筛选数据框时返回空数据框的原因及解决办法
问题场景
想要对数据框distal.results.stratified.model.1a做子集筛选,保留probeID列值匹配列表coMeth_ls中任意cg*格式项的行,但执行以下代码后返回空数据框:
distal.dmr.cpgs.1a <- distal.results.stratified.model.1a[ sapply( strsplit(distal.results.stratified.model.1a$probeID, ' '), function(x) any(x %in% coMeth_ls)), ]
数据详情
> dput(distal.results.stratified.model.1a[1:3,1:3]) structure(list(regionID = c("chr1:1355332-1355333", "chr1:15934516-15934517", "chr1:15934516-15934517"), probeID = c("cg03324138", "cg01522970", "cg01522970"), target = c("ENSG00000162576", "ENSG00000065526", "ENSG00000065526")), row.names = c(NA, 3L), class = "data.frame") > dput(coMeth_ls[1:10]) list(`chr1:2250410-2250796` = c("cg03324138", "cg02237208", "cg00567930" ), `chr1:2886792-2886868` = c("cg01977798", "cg00050294", "cg04080530" ), `chr1:8271997-8272277` = c("cg02847588", "cg00590817", "cg06780032" ), `chr1:10895950-10896004` = c("cg02971581", "cg09510180", "cg00944431" ), `chr1:12600225-12600529` = c("cg07586026", "cg07242540", "cg00003578" ), `chr1:16553267-16553456` = c("cg03969515", "cg03522107", "cg02987928" ), `chr1:19665131-19665240` = c("cg09356672", "cg05348366", "cg04928049" ), `chr1:23003462-23003569` = c("cg01795776", "cg09062638", "cg02623028" ), `chr1:28573736-28573940` = c("cg05045517", "cg03226554", "cg07148744", "cg07913096"), `chr1:29460817-29461070` = c("cg06155303", "cg09264065", "cg08597839", "cg00107241"))
错误原因
- 多余的
strsplit操作:你的probeID列是单个cg*字符串,没有空格分隔,拆分后得到的是单元素向量,这步完全没必要,属于冗余操作。 - 核心匹配错误:
coMeth_ls是嵌套列表,每个元素是对应区域的cg*向量。你直接用x %in% coMeth_ls,是拿单个cg值和整个列表元素(向量)做匹配,永远不会返回TRUE,自然筛选不到任何行。
解决办法
先把嵌套列表里的所有cg*值提取成一个扁平的向量,再用这个向量做匹配筛选。
基础R实现
# 提取所有cg*值到扁平向量 all_cg_values <- unlist(coMeth_ls) # 直接筛选,无需strsplit distal.dmr.cpgs.1a <- distal.results.stratified.model.1a[ distal.results.stratified.model.1a$probeID %in% all_cg_values, ]
dplyr实现(更直观)
library(dplyr) all_cg_values <- unlist(coMeth_ls) distal.dmr.cpgs.1a <- distal.results.stratified.model.1a %>% filter(probeID %in% all_cg_values)
执行后就能得到包含probeID为cg03324138的行,符合预期。
内容的提问来源于stack exchange,提问作者Anon
相关产品推荐
相关产品推荐

