使用for循环或apply、sapply函数扩增SNP数据框生成目标表
R语言实现数据行扩增方案
前置说明
原始数据包含CHR、Start_pos、End_pos、SNP、plink.A2、plink.A16个字段,需为每行添加指定偏移量序列生成10条新行,固定字段取值与原行一致。
基础准备
先定义示例数据与偏移量序列:
# 构造示例原始数据 raw_df <- data.frame( CHR = c(1, 2, 3), Start_pos = c(1000, 2000, 3000), End_pos = c(1050, 2050, 3050), SNP = c("rs123", "rs456", "rs789"), plink.A2 = c("A", "T", "C"), plink.A1 = c("G", "C", "G") ) # 定义偏移量序列 offset_list <- c(71, 141, 211, 281, 351, 421, 491, 561, 631, 701)
方法一:for循环实现
思路:逐行遍历原始数据,生成对应扩增行后拼接为最终表:
# 初始化结果表 expand_df <- data.frame() # 遍历原始数据每一行 for (row_idx in 1:nrow(raw_df)) { current_row <- raw_df[row_idx, ] # 生成当前行的10条扩增数据 temp_df <- data.frame( CHR = current_row$CHR, Start_pos = current_row$Start_pos + offset_list, End_pos = current_row$End_pos + offset_list, SNP = current_row$SNP, plink.A2 = current_row$plink.A2, plink.A1 = current_row$plink.A1 ) # 拼接至结果表 expand_df <- rbind(expand_df, temp_df) }
小提示:如果原始数据量超过10万行,建议提前预分配结果表的行空间,可大幅降低rbind动态扩容的性能损耗
方法二:apply族实现
用lapply按行应用扩增逻辑,最后合并所有结果:
# 定义单行扩增函数 row_expand_func <- function(input_row) { data.frame( CHR = input_row[["CHR"]], Start_pos = as.numeric(input_row[["Start_pos"]]) + offset_list, End_pos = as.numeric(input_row[["End_pos"]]) + offset_list, SNP = input_row[["SNP"]], plink.A2 = input_row[["plink.A2"]], plink.A1 = input_row[["plink.A1"]] ) } # 按行应用函数后合并结果 expand_df <- do.call(rbind, lapply(1:nrow(raw_df), function(i) row_expand_func(raw_df[i, ])))
补充:向量化实现(性能最优)
如果不需要强制用循环/apply类函数,向量化操作的运行效率最高,适合超大数据量场景:
# 重复原始行10次 expand_df <- raw_df[rep(1:nrow(raw_df), each = length(offset_list)), ] # 批量更新位置字段 expand_df$Start_pos <- expand_df$Start_pos + rep(offset_list, nrow(raw_df)) expand_df$End_pos <- expand_df$End_pos + rep(offset_list, nrow(raw_df))
内容的提问来源于stack exchange,提问作者azlilili
相关产品推荐
相关产品推荐

