R语言中基于两个DataFrame应用自定义公式计算的实现求助
R语言实现自定义公式计算两个DataFrame的匹配运算
数据构造
先还原你提供的两个DataFrame:
# 构造df1 df1 <- data.frame( chr = rep("chr1", 9), start = c(3531569, 3670538, 4491645, 4496542, 4571267, 4688213, 4688800, 4688800, 4688800), end = c(3531966, 3672624, 4493854, 4497750, 4572265, 4688719, 4688919, 4688919, 4688919), strand = rep("-", 9), bam1 = c(2, 251, 220, 115, 64, 39, 20, 2, 1), bam2 = c(2, 50, 46, 41, 32, 10, 30, 4, 2), bam3 = c(1, 170, 179, 100, 77, 20, 10, 6, 3), bam4 = c(4, 165, 167, 67, 44, 20, 20, 8, 4), bam5 = c(8, 294, 275, 114, 76, 14, 14, 10, 5), bam6 = c(36, 259, 332, 69, 130, 23, 55, 12, 6), bam7 = c(21, 665, 414, 42, 179, 25, 17, 14, 7), bam8 = c(1, 86, 77, 63, 27, 17, 20, 16, 8), stringsAsFactors = FALSE ) # 构造df2 df2 <- data.frame( bam_file = paste0("bam", 1:8), r1 = c(2, 9, 1, 1, 1, 8, 3, 3), r2 = c(1, 3, 4, 5, 1, 6, 7, 2), stringsAsFactors = FALSE )
实现方案
核心用向量化运算替代逐元素循环,效率更高:
- 提取df1中参与计算的bam列(第5到12列)
- 提取df2中的r1、r2数值向量
- 对df1的每一行,计算与r1、r2向量的平方差之和,再除以
ncol(df1)-4(即8)
# 提取df1的bam列 bam_data <- df1[, 5:12] # 提取df2的r1、r2向量 r1_vals <- df2$r1 r2_vals <- df2$r2 # 计算每行的结果 denominator <- ncol(df1) - 4 # 分母固定为8 output <- data.frame( r1 = apply(bam_data, 1, function(row) sum((r1_vals - row)^2) / denominator), r2 = apply(bam_data, 1, function(row) sum((r2_vals - row)^2) / denominator) ) # 查看结果 print(output)
运行结果
运行代码后输出与预期完全一致:
> print(output) r1 r2 1 152.3750 144.7500 2 89140.2500 88467.8750 3 57822.7500 57413.1250 4 6195.1250 6148.0000 5 8007.3750 7858.7500 6 395.7500 372.6250 7 508.7500 543.1250 8 60.7500 47.1250 9 15.5000 6.8750
内容的提问来源于stack exchange,提问作者learner
相关产品推荐
相关产品推荐

