忽略R中平均值计算中的最大值

忽略R中平均值计算中的最大值,r,filter,max,multiple-columns,mean,R,Filter,Max,Multiple Columns,Mean,我有下面的样本df,来自20米短跑测试运动员,分次测试。他们做了3次试验。我想为每个拆分创建新的列,平均他们的两个最快的测试和最慢的测试 以下是df的示例: Athlete 0_10m_1 10_20m_1 0_20m_1 0_10m_2 10_20m_2 0_20m_2 0_10m_3 10_20m_3 0_20m_3 1 Athlete 1 2.005 1.320 3.325 1.904 1.306 3.210 1.993 1.316 3.3

我有下面的样本df,来自20米短跑测试运动员,分次测试。他们做了3次试验。我想为每个拆分创建新的列,平均他们的两个最快的测试和最慢的测试

以下是df的示例:

    Athlete 0_10m_1 10_20m_1 0_20m_1 0_10m_2 10_20m_2 0_20m_2 0_10m_3 10_20m_3 0_20m_3
1 Athlete 1   2.005    1.320   3.325   1.904    1.306   3.210   1.993    1.316   3.309
2 Athlete 2   1.967    1.383   3.350   1.931    1.391   3.322   2.005    1.399   3.404
3 Athlete 3   2.008    1.381   3.389   2.074    1.365   3.439   2.047    1.408   3.455
4 Athlete 4   1.817    1.286   3.103   1.924    1.285   3.209      NA       NA      NA

最终结果将是3个新的列,根据0_20m时间平均值0_10m、平均值10_20m、平均值0_20m,得出2个最快试验的平均值。理想情况下,解决方案足够健壮,可以处理NA值,因为数据集中会有一些NA值


关于如何处理这个问题有什么建议吗?我不知道如何筛选出最慢的0_20m试验和相关的分割时间,并平均其他试验

首先创建data.frame

library(tidyverse)

x <- read.table(text=" Athlete 0_10m_1 10_20m_1 0_20m_1 0_10m_2 10_20m_2 0_20m_2 0_10m_3 10_20m_3 0_20m_3
'Athlete 1'   2.005    1.320   3.325   1.904    1.306   3.210   1.993    1.316   3.309
'Athlete 2'   1.967    1.383   3.350   1.931    1.391   3.322   2.005    1.399   3.404
'Athlete 3'   2.008    1.381   3.389   2.074    1.365   3.439   2.047    1.408   3.455
'Athlete 4'  1.817    1.286   3.103   1.924    1.285   3.209      NA       NA      NA", header=TRUE, check.names=FALSE)


x %>%
  gather(trial,time,-Athlete) %>%
  separate(trial, sep = "(?<=m)_", into = c("trial_time", "trial_try")) %>%
  group_by(Athlete, trial_time) %>%
  group_split() %>%
  purrr::map(function(x) {
    x %>%
      arrange(time) %>%
      group_by(Athlete, trial_time) %>%
      summarise(time_avg = mean(time[1:2], na.rm = TRUE))
  }) %>%
  bind_rows() %>%
  spread(trial_time, time_avg)
x <- read.table(text="x Athlete 0_10m_1 10_20m_1 0_20m_1 0_10m_2 10_20m_2 0_20m_2 0_10m_3 10_20m_3 0_20m_3
1 Athlete 1   2.005    1.320   3.325   1.904    1.306   3.210   1.993    1.316   3.309
2 Athlete 2   1.967    1.383   3.350   1.931    1.391   3.322   2.005    1.399   3.404
3 Athlete 3   2.008    1.381   3.389   2.074    1.365   3.439   2.047    1.408   3.455
4 Athlete 4   1.817    1.286   3.103   1.924    1.285   3.209      NA       NA      NA", header=T, check.names=F)


x %>% select(-x) %>% 
   gather("split", "time", -Athlete) %>% 
   mutate(split = gsub("_\\d$","", split)) %>% 
   group_by(Athlete, split) %>% 
   arrange(time) %>% 
   slice(1:2) %>% 
   summarize(Avg = mean(time))
# A tibble: 12 x 3
# Groups:   Athlete [4]
#   Athlete split    Avg
#     <int> <chr>  <dbl>
# 1       1 0_10m   1.95
# 2       1 0_20m   3.26
# 3       1 10_20m  1.31
# 4       2 0_10m   1.95
# 5       2 0_20m   3.34
# 6       2 10_20m  1.39
# 7       3 0_10m   2.03
# 8       3 0_20m   3.41
# 9       3 10_20m  1.37
#10       4 0_10m   1.87
#11       4 0_20m   3.16
#12       4 10_20m  1.29

到目前为止你都试了些什么?老实说,我有点不知道从哪里开始。我对R还不是很了解。例如,我知道如何使用apply:applydf[,c0_20m_1,0_20m_2,0_20m_3],1,max来定位最大值。它返回我要过滤掉的最大值,但如何将它们连接到同一试验的0_10m和10_20m?我认为我需要使它成为真/假,并且首先不返回值。那我可以用if语句吗?i、 e.如果为真,则不包括在平均值函数中。我认为您不需要描述时间b/c您需要两个最快时间的平均值。因此,我将最高时间安排到最低时间,并选择两个第一行并计算平均值。对,但最快时间是最小时间,而不是最大时间是的,对不起,因此,您只需删除函数desc,就得到了所需的内容。对不起,我想你们俩真的很接近!艾米尔曼,是不是要改变你的解决方案,比如说最后一次0_20m的试验是最慢的,这样就可以从平均值计算中剔除整个试验。因为一名运动员可能会有较慢的0_10米时间,但在同一次试验中,可以弥补这一点,并有较快的0_20米时间。因此,0_20m的时间决定了其他分割是否包括在平均值中,不管该试验中的分割时间是否比另一个试验快。我不确定这是否有意义!