R语言中筛选含NM_/GE_开头内容的文件索引失败排查
嘿,我来帮你排查下问题所在,以及怎么解决:
第一个问题:正则表达式匹配的位置不对
你写的^NM_|^GE_是匹配整行开头的NM/GE,但看你的第三个列表里的行,比如"1,NM_012429,6.44764696592035,0.84120306786724",NM_是在逗号后面,不是行首,所以这个正则根本匹配不到该行。
你实际需要的是匹配任意位置的NM_/GE_开头的字段,也就是要么在行首,要么在逗号之后。可以把正则改成:
"(^|,)NM_|(^|,)GE_"
这个正则的意思是:匹配行首或者逗号后面跟着NM_或者GE_的内容,这样就能覆盖前两个列表里行首的NM_,以及第三个列表里逗号后的NM_了。
第二个问题:lapply返回的是列表,没法直接用which筛选
lapply(lines, ...)返回的是一个由逻辑值组成的列表,而which(...) == TRUE只能处理逻辑向量。直接用列表和单个TRUE比较,会得到一个逻辑值的列表,which处理这种列表就会返回integer(0),这就是你看到的结果。
解决办法是用sapply代替lapply,它会把列表转换成逻辑向量,然后再用which取索引。
修正后的完整代码
把这两点结合起来,代码就变成这样:
# 定义匹配字段开头的NM_/GE_的正则 match_pattern <- "(^|,)NM_|(^|,)GE_" # 用sapply得到每个文件的匹配结果(逻辑向量),再取索引 which(sapply(lines, function(x) any(grepl(match_pattern, x, ignore.case = TRUE))))
测试你的示例数据,这个代码会返回[1] 1 2 3,完全符合你的预期。
如果你的需求更精准——比如只匹配ID字段里的NM/GE开头内容(注意第三个文件的ID是第二个字段,前两个是第一个字段),也可以先拆分每行的字段再判断,不过如果只是要找出包含目标内容的文件索引,上面的代码就足够啦。
内容的提问来源于stack exchange,提问作者AwaitedOne
相关产品推荐
相关产品推荐

