使用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
相关产品推荐
相关产品推荐

