You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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
)

实现方案

核心用向量化运算替代逐元素循环,效率更高:

  1. 提取df1中参与计算的bam列(第5到12列)
  2. 提取df2中的r1、r2数值向量
  3. 对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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 05:48:25