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

网球共同对手R脚本优化需求:提升15万行数据集计算效率

求助:优化R脚本以处理15万行网球共同对手数据

我目前在跟进一篇关于网球共同对手的论文,核心目标是写出最高效的R计算脚本,但现在遇到了大麻烦:当前代码单场比赛计算耗时约120秒,而我需要处理的数据集足足有15万行,这样的效率完全无法完成任务,恳请各位帮忙优化!

代码背景

我的代码基于论文中的模型逻辑,用到了三个数据集(tableA、tableB、data_tennis_co),核心是计算两名选手的共同对手得分均值。但目前大量的循环和冗余操作拖垮了速度,急需优化思路。

当前低效代码

data_tennis_co = read.table("test_co.csv", header=FALSE, sep=",", fill = TRUE)
A = read.table("tableA.csv", header=FALSE, sep=",", fill = TRUE)
B = read.table("tableB.csv", header=FALSE, sep=",", fill = TRUE)

# 基础计算函数
G <- function(p) {
  res <- p^4 * (15 - 4*p - ((10*p^2)/(1 - 2*p*(1-p))))
}

d <- function(p, q) {
  res <- p*q / (1 - (p*(1-q) + (1-p)*q))
}

TB <- function(p, q) {
  res <- foreach(i = seq_along(1:28), .combine = sum) %dopar% {
    tb <- A[i,1] * p^A[i,2] * (1-p)^A[i,3] * q^A[i,4] * (1-q)^A[i,5] * d(p,q)^A[i,6]
  }
}

S <- function(p, q) {
  res <- foreach(i = seq_along(1:21), .combine = rbind) %dopar% {
    s <- B[i,1] * G(p)^B[i,2] * (1-G(p))^B[i,3] * G(q)^B[i,4] * (1-G(q))^B[i,5] * 
      (G(p)*G(q) + (G(p)*(1-G(q)) + (1-G(p))*G(q))*TB(p,q))^B[i,6]
  }
  sum(res)
}

M3 <- function(p, q) {
  res <- S(p,q)^2 * (1 + 2*(1 - S(p,q)))
}

DELTA_AB <- function(spwAC, rpwAC, spwBC, rpwBC) {
  res <- (spwAC - (1 - rpwAC)) - (spwBC - (1 - rpwBC))
}

PR <- function(spwAC, rpwAC, spwBC, rpwBC) {
  delta <- DELTA_AB(spwAC, rpwAC, spwBC, rpwBC)
  res <- (M3(0.6 + delta, 0.4) + M3(0.6, 1 - (0.6 - delta))) / 2
}

# 共同对手计算核心函数
MAL <- function(id1, id2) {
  prova <- subset(data_tennis_co, V3 == id1 & V4 == id2)
  previous <- subset(data_tennis_co, V2 < prova$V2)
  
  s1 <- subset(previous, V3 == id1 | V4 == id1)
  s1$opp <- ifelse(s1$V3 == id1, s1$V4, s1$V3)
  
  s2 <- subset(previous, V3 == id2 | V4 == id2)
  s2$opp <- ifelse(s2$V3 == id2, s2$V4, s2$V3)
  
  inn <- intersect(s1$opp, s2$opp)
  common1 <- s1[s1$opp %in% inn, ]
  common2 <- s2[s2$opp %in% inn, ]
  
  COM <- merge(common1, common2, by = "opp")
  COM$OMALLEY <- unlist(mapply(PR, COM$V5.x, COM$V6.x, COM$V7.y, COM$V8.y))
  COM$OMALLEY[is.nan(COM$OMALLEY)] <- 0.5
  
  return(tryCatch(sum(COM$OMALLEY)/nrow(COM), error = function(e) NaN))
}

# 测试耗时
tic()
RESA <- MAL(1,2)
toc()

希望优化的方向

我自己猜测问题可能出在foreach的滥用、重复计算(比如TB(p,q)在S里被多次调用)、数据子集操作的低效这些点上,但不知道具体怎么改。希望各位能帮忙:

  • 清理冗余代码,简化计算逻辑
  • 把循环改成向量运算,避免不必要的并行开销
  • 提升数据筛选、合并的效率
  • 任何能降低单场计算时间的建议都可以!

内容的提问来源于stack exchange,提问作者Mirko Piccolo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:29:39