我有几年赛马表现的数据集,我想计算马达到最佳表现的年龄。以下是我的数据的一个组成示例:
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
按组计算方法,但我不认为这正是我所需要的,因为它必须首先查看时间,然后从最快的一个。
我很感激任何帮助!谢谢!
答案 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
简短说明: