You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 01:00:59