#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 /… .