如何基于独立dataframe的列信息向新dataframe的行中添加数据
高效实现方案
以下两种方案都可以完全避免嵌套for循环,运算效率远高于手动遍历匹配:
方案1:tidyverse 实现(可读性高)
适合中小规模数据集,代码逻辑清晰易维护
# 加载依赖包 library(tidyverse) # 批量读取+处理所有表达文件 output_df <- list.files(data_dir, full.names = TRUE) %>% map(function(file_path) { # 读取单份制表符分隔的表达数据 read_tsv(file_path, show_col_types = FALSE) %>% # 统一前两列列名,避免不同文件列名不一致的问题 rename_with(~c("Gene", "expression"), everything()) %>% # 转为宽表,基因名做列名,表达量做值 pivot_wider(names_from = Gene, values_from = expression) }) %>% # 按行合并所有样本的表达数据,缺失基因自动填充NA bind_rows() %>% # 保留预先定义的output_df的所有列,顺序和原output_df完全一致 select(all_of(colnames(output_df)))
方案2:data.table 实现(运行速度极快)
适合大样本、大数据量场景,运算效率比tidyverse高3-10倍
# 加载依赖包 library(data.table) # 获取所有文件路径 file_paths <- list.files(data_dir, full.names = TRUE) # 批量读取、处理、合并数据 merged_dt <- rbindlist(lapply(file_paths, function(p) { # 快速读入文件 dt <- fread(p) # 统一列名 setnames(dt, c("Gene", "expression")) # 转为宽表 dcast(dt, . ~ Gene, value.var = "expression")[, !"."] }), fill = TRUE) # 匹配原output_df的列顺序和列范围,转回data.frame格式(不需要的话可以省略setDF) output_df <- setDF(merged_dt[, .SD, .SDcols = colnames(output_df)])
注意事项
- 读取无表头文件时,需要在
read_tsv/fread中添加header = FALSE参数 - 需确保预先定义的
output_df列名和各表达文件中的基因名拼写、大小写完全一致,否则会识别为缺失值填充NA - 如果需要保留每个样本的来源文件名,可以在处理单文件时加一列
dataset = basename(file_path)即可
内容的提问来源于stack exchange,提问作者JVDeasyas123
相关产品推荐
相关产品推荐

