Как мне определить, в какой стране наименьшее среднее время для завершения марафона?

#r

#r

Вопрос:

У меня есть набор данных со столбцом стран и столбцом времени, которое потребовалось им для пробежки марафона. Я хочу выяснить, какие 5 стран завершили марафон в среднем за наименьшее время. Я новичок в R, поэтому имею только базовые знания. Столбец времени указан в часах. пример данных: марафон $Countries — столбец национальности каждого бегуна, марафон $OverallHrs — общее время, затраченное на прохождение марафона для каждого бегуна.

Я пытался

 tapply(marathon$OverallHrs, marathon$Country, mean)
  

Это не сработало так, как я хочу

Комментарии:

1. Является ли «марафон» хорошо известным набором данных? Похоже, этого нет в моих предварительно загруженных наборах данных (видно по running data() . Вы должны добавить образец данных к своему вопросу.

Ответ №1:

Я предполагаю, что вы не имеете в виду тривиальный случай, когда у вас нет повторяющихся стран для вашего столбца «страна». Новичкам в R я бы настоятельно рекомендовал начать обучение с пакета «tidyverse».

Ниже приведено решение, в котором вы можете указывать повторяющиеся страны для столбца «Страна»

 library(tidyverse)

set.seed(123)
# Generate 10 Countries, each one 5 times
A = sample(rep(1:10,5))
# Generate 50 random timing from (5-20)
B = round(runif(50)*15   5)

#Create a dataframe with columns (Country, Timing), rows = 50
df = data.frame("Country" = paste0("Country",A),
                "Timing" = B)

#Dataframe will look like this
# Country Timing
# 1  Country5     15
# 2  Country4     17
# 3  Country4      5
# 4  Country3     12
# 5  Country5     16

# Calculate average marathon timing
df_mean <- df %>%
  group_by(Country) %>% #Group
  summarise(Mean_Timing = mean(Timing), .groups = 'drop') %>% #Calculate Mean_Timing
  arrange(Mean_Timing) # Arrange by fastest timing first


#Dataframe = df_mean
# A tibble: 10 x 2
# Country   Mean_Timing
# <chr>           <dbl>
# 1 Country9         10.6
# 2 Country1         11.4
# 3 Country3         11.4
# 4 Country4         11.4
# 5 Country2         12.2
# 6 Country10        12.6
# 7 Country8         13.2
# 8 Country7         13.6
# 9 Country5         15  
# 10 Country6         15.2

#To get the first 5 country, would just be
df_mean$Country[1:5]
# "Country9" "Country1" "Country3" "Country4" "Country2"
  

В R всегда есть агрегированная функция для вычисления среднего значения по группе. Меньший код, но я все равно предпочитаю метод tidyverse, поскольку он интуитивно понятен в использовании через некоторое время и может быть слегка изменен для решения любого вопроса с фреймом данных.
В любом случае, вот решение с использованием aggregate.

 df_mean2 <- aggregate(df[, 2], list(df$Country), mean) # Calculate Mean
df_mean2[order(df_mean2$x), ] # Sort by ascending
     Group.1    x
10  Country9 10.6
1   Country1 11.4
4   Country3 11.4
5   Country4 11.4
3   Country2 12.2
2  Country10 12.6
9   Country8 13.2
8   Country7 13.6
6   Country5 15.0
7   Country6 15.2
  

Комментарии:

1. Спасибо, Энди! Можете ли вы помочь мне отобразить эти результаты на гистограмме? С этими странами внизу и их средними значениями по оси y?

2. @DavidWall я думаю, что вы имеете в виду гистограмму, а не гистограмму. У вас есть только 1 переменная для гистограммы. У большинства людей есть свои предпочтения в настройке гистограммы, вы можете начать отсюда sthda.com/english/wiki /… .