在R函数中合并多文件夹TSV数据框时遇参数缺失报错的问询
问题描述
文件夹结构
-test1 -test2 -test3 -test4 -test5
每个文件夹下存放.tsv格式文件,现有R处理代码如下:
process <- function(f){ df <- read.csv(f, sep = "\t", header = F) colnames(df) <- c("1","2","3","4","5","6","7","8","9") df <- df[-c(1, 2, 3, 4, 5, 6),] df <- df[c("1", "7")] df <- merge(df, df, by="1") print(df) } files <- dir("path", recursive = T, full.names = T, pattern = "*.tsv") sapply(files, process)
当前代码仅能打印单个处理后的数据集,无法将所有结果按列"1"合并为一个完整数据框,且运行时触发报错:
Error in as.data.frame(y) : argument "y" is missing, with no default
解决方法
1. 修复process函数的冗余逻辑并明确返回值
原代码中merge(df, df, by="1")是完全冗余的自合并操作,会导致数据重复且干扰后续合并。修改函数让它返回处理后的单个数据框,并为每个文件的数值列重命名(避免合并后列名冲突):
process <- function(f){ df <- read.csv(f, sep = "\t", header = F) colnames(df) <- c("1","2","3","4","5","6","7","8","9") df <- df[-c(1:6),] # 简化索引写法 df <- df[c("1", "7")] # 给每个文件的数值列重命名,关联文件名便于区分 colnames(df)[2] <- paste0("value_", tools::file_path_sans_ext(basename(f))) return(df) # 明确返回处理后的数据集 }
2. 改用lapply收集数据集再批量合并
sapply会自动将数据框转为矩阵,不适合后续合并操作。用lapply获取完整的数据集列表,再通过Reduce循环按列"1"合并所有结果:
# 修正正则表达式,精准匹配.tsv结尾的文件 files <- dir("path", recursive = TRUE, full.names = TRUE, pattern = "\\.tsv$") # 生成所有处理后的数据集列表 df_list <- lapply(files, process) # 按列"1"合并所有数据集,保留所有行(如需仅保留共同行可去掉all=TRUE) final_df <- Reduce(function(x, y) merge(x, y, by = "1", all = TRUE), df_list)
报错原因说明
- 原函数仅执行
print(df)而未明确返回数据集,导致sapply返回的是打印结果的列表而非有效数据集列表; - 冗余的自合并操作无意义,且破坏了数据集的结构;
- 原正则表达式
pattern = "*.tsv"不严谨,可能匹配到非目标文件。
内容的提问来源于stack exchange,提问作者szmple
相关产品推荐
相关产品推荐

