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

使用R语言计算赛马峰值表现年龄

Hey Laura, 针对你想要计算每匹马达到峰值表现年龄的需求,这里有几个实用的R实现方案,结合你提供的示例数据来一步步演示:

首先先确认下数据逻辑:从你的示例来看,P2是时间指标,数值越小代表马匹的表现越好(比如Ari在16岁时P2最低,表现最优),所以我们的核心目标就是按每匹马分组,找到对应P2最小值的Competition.age。

先还原你的示例数据

data <- data.frame( 
  Name=c(rep("Ari",3),rep("Aegir",3),rep("Lixhof",3)), 
  Competition.year = c("2015", "2013", "2012", "2008", "2009", "2010", "2015", "2016", "2017"), 
  P2=c(7.97, 8.40, 8.51, 9.49, 8.70, 8.40, 8.82, 9.07, 8.59), 
  Competition.age=c(16,14,13,8,9,10,12,13,14)
)

方法1:用dplyr包(推荐,代码更直观)

dplyr是R中处理分组数据的常用工具,先确保你安装了这个包:

install.packages("dplyr")
library(dplyr)

然后按马匹分组,筛选出每组中P2最小的记录,提取对应年龄:

peak_age <- data %>%
  group_by(Name) %>%
  # 筛选出当前马匹P2最小的记录
  filter(P2 == min(P2)) %>%
  # 只保留需要的列
  select(Name, Competition.age) %>%
  # 重命名列让结果更易懂
  rename(Peak_Performance_Age = Competition.age)

# 查看结果
print(peak_age)

运行后输出结果:

# A tibble: 3 × 2
# Groups:   Name [3]
  Name   Peak_Performance_Age
  <chr>                 <dbl>
1 Ari                      16
2 Aegir                    10
3 Lixhof                   14

如果遇到某匹马在多个年龄有相同的最小P2(比如两年龄表现一样好),上面的代码会保留所有对应的年龄。如果你只想保留其中一个(比如最早达到峰值的年龄),可以调整代码:

peak_age_single <- data %>%
  group_by(Name) %>%
  # 先按P2升序排序,再按年龄升序排序
  arrange(P2, Competition.age) %>%
  # 取每组的第一行
  slice(1) %>%
  select(Name, Competition.age) %>%
  rename(Peak_Performance_Age = Competition.age)

方法2:Base R实现(无需额外安装包)

如果你不想用第三方包,也可以用base R的ave()函数来处理:

# 找到每组中P2最小的行的索引
peak_indices <- ave(data$P2, data$Name, FUN = function(x) x == min(x)) == 1
# 提取对应行的名称和年龄列
peak_age_base <- data[peak_indices, c("Name", "Competition.age")]
# 重命名列
colnames(peak_age_base)[2] <- "Peak_Performance_Age"

# 查看结果
print(peak_age_base)

这个方法也能得到和dplyr完全一致的结果,适合不想额外安装包的场景。

内容的提问来源于stack exchange,提问作者Laura Bas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:30:24