计算R中峰值性能的年龄

时间:2018-04-29 10:11:44

标签: r filter aggregate

我有几年赛马表现的数据集,我想计算马达到最佳表现的年龄。以下是我的数据的一个组成示例:

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))

此处,P2是时间记录的变量。值越小,性能越好(我正在寻找计算峰值性能的最快时间)。比赛年龄显示每匹马每年比赛的年龄(以年为单位)。

我的真实数据有大约2000个对127匹马的观察。我想要的是计算他们达到最佳表现的平均年龄(例如,在什么年龄是马,一般来说,最快)。我看过一些帖子使用aggregate按组计算方法,但我不认为这正是我所需要的,因为它必须首先查看时间,然后从最快的一个。

我很感激任何帮助!谢谢!

3 个答案:

答案 0 :(得分:2)

根据你的例子你可以使用这样的东西。

library(dplyr)

df_min <- df %>% 
  group_by(Name) %>% 
  filter(P2 == min(P2)) # filter records on fastest race time per horse

mean(df_min$Competition.age)
[1] 13.33333

正如@MKR指出的那样,你也可以在一个声明中做到这一点。输入稍微多一些,你没有df_min的中间结果。这完全取决于你想用你的数据做什么。

df_min <- df %>% 
  group_by(Name) %>% 
  filter(P2 == min(P2)) %>% 
  ungroup() %>% 
  summarise(best_age = mean(Competition.age)) 

答案 1 :(得分:2)

我们可以使用average计算data.table,方法是首先过滤具有最高性能(min(P2))的匹马年龄,然后取mean Competition.age 1}} as:

library(data.table)
setDT(data)

data[,.SD[P2 == min(P2)], by=.(Name)][,mean(Competition.age)]
#[1] 13.33333

答案 2 :(得分:0)

为了完整起见,这里是聚合的解决方案:

best <- aggregate(P2 ~ Name, data = data, FUN = min)
best <- merge(data, best)
mean(best$Competition.age)
#> [1] 13.33333

简短说明:

  1. 按名称选择最小P2值
  2. 将精简数据集与原始数据合并
  3. 取平均年龄。