如何用R从189个文件各提取1列并创建新数据框?
解决R循环读取多文件并合并指定列的问题
你的代码核心问题是每次循环都用新文件的列覆盖了变量E,导致最终只保留最后一个文件的结果,另外还有一行逻辑错误的无用代码。下面是修正后的方案:
修正后的循环写法
number <- 189 cnt <- 5 # 预先初始化空数据框用于存储结果 E <- data.frame() for(i in 1:number){ cnt <- cnt + 1 print(i) # 直接读取目标列,无需加载整个文件后再筛选 target_col <- fread(paste0("Trait", cnt, ".SOL"), colClasses = "character", select = 8) # 指定仅读取第8列,提升效率 # 给列命名以区分不同文件 colnames(target_col) <- paste0("Trait", cnt) # 将新列合并到结果数据框中 E <- cbind(E, target_col) }
更高效的批量处理写法(推荐)
R中用lapply批量处理文件比for循环更简洁高效:
# 生成所有需要读取的文件名(对应Trait6.SOL到Trait194.SOL) file_list <- paste0("Trait", 6:(5+189), ".SOL") # 批量读取每个文件的第8列 collections <- lapply(file_list, function(f) { fread(f, colClasses = "character", select = 8) }) # 将所有列合并为一个数据框 E <- do.call(cbind, collections) # 给数据框的列设置有意义的名称 colnames(E) <- gsub("\\.SOL", "", file_list)
关键说明
- 原代码中
row<-which(dfn==nrow(dfn))逻辑错误且未被使用,直接删除即可 - 使用
fread的select参数可以只读取需要的列,避免加载整个文件,大幅提升速度 - 确保所有文件的行数一致,否则
cbind会报错;如果行数不一致,需要先统一行数或处理缺失值
内容的提问来源于stack exchange,提问作者naghme saedi
相关产品推荐
相关产品推荐

