使用sapply读取多TSV文件时内容重复的问题求助
问题原因与解决方案
核心原因1:函数返回值错误
你写的sapply函数最后一行是df$ID=gsub("\\..*","", df$gene_id)——这是一个赋值操作,R函数默认会返回最后一个表达式的运行结果,也就是这个赋值后的df$ID向量,而非你处理后的完整数据框。
而这些TSV文件应该都是小鼠不同组织的样本数据,基因ID列本身就是相同的参考基因集,所以每个文件的df$ID内容自然一致,你看到的head结果重复,本质是只查看了基因ID列,而非整个数据的差异。
核心原因2:正则表达式写法错误
grep("ENSMUS*", df$gene_id)里的正则逻辑不对:*是修饰前一个字符S,表示匹配ENSMU后接任意个S(包括0个),会误匹配到类似ENSMU、ENSMUSS这类不符合预期的字符串。如果要筛选以ENSMUS开头的基因ID,应该用^ENSMUS(^表示匹配字符串开头)。
潜在风险:文件路径问题
list.files(path="/my/path/tracks")默认只返回文件名,若你的当前工作目录不是/my/path/tracks,read_tsv(i)会在当前目录找文件,很可能找不到报错。虽然你目前没遇到,但最好加上full.names=TRUE获取完整文件路径,避免后续路径问题。
修正后的代码
files <- list.files(path="/my/path/tracks", full.names=TRUE) head(files) try <- sapply(files, simplify=FALSE, function(i){ message("reading file ", i, "..." ) df <- read_tsv(file = i) # 正确筛选以ENSMUS开头的基因ID df <- df[grep("^ENSMUS", df$gene_id),] df$ID <- gsub("\\..*","", df$gene_id) # 明确返回处理后的完整数据框 return(df) })
验证方法
修正后你可以查看数据框的其他列(比如表达量列),或者用nrow(try[[1]])、nrow(try[[2]])对比不同文件的行数,就能看到内容差异了。
内容的提问来源于stack exchange,提问作者jonny jeep
相关产品推荐
相关产品推荐

