Мне нужно создать частичный набор данных, содержащий только 20 дней с самыми высокими значениями среднесуточной температуры воздуха для каждого года. Мой набор данных выглядит так:
...
Я попытался использовать приведенный ниже код, но он фильтрует только максимум за каждый год и создает фрейм данных с 20 строками, но мне нужны 20 лучших средних значений за каждый год (1997–2010). Кстати, я использую класс data.frame. Буду очень благодарен, если кто-нибудь сможет мне помочь, я просто не могу в этом разобраться!
top_20_per_year <- daily_mean_temp_sorted %>%
slice_max(mean, n = 20) %>%
Пример взятия двух верхних значений mean
по year
:
library(tidyverse)
df <- tribble(
~date, ~mean,
"1997-07-15", 27.05292,
"1997-07-17", 26.86542,
"1997-06-21", 26.10958,
"1997-07-16", 26.05833,
"1997-07-14", 26.02500,
"1998-06-25", 25.80125,
"1998-07-18", 25.36208,
"1998-06-22", 25.18875,
"1998-06-29", 24.72333,
"1998-06-30", 24.71000
)
df |>
mutate(date = ymd(date), year = year(date)) |>
slice_max(n = 2, order_by = mean, by = year)
#> # A tibble: 4 × 3
#> date mean year
#> <date> <dbl> <dbl>
#> 1 1997-07-15 27.1 1997
#> 2 1997-07-17 26.9 1997
#> 3 1998-06-25 25.8 1998
#> 4 1998-07-18 25.4 1998
Created on 2024-04-29 with reprex v2.1.0
ох, ты опередил меня на несколько секунд... Аргумент by
весьма удобен. Я не знал об этом, но стоит также отметить, что это экспериментальная функция, которая может быть изменена или удалена в будущих выпусках...
Да, у меня такое ощущение, что это приживется, поскольку временная группировка теперь встроена во многие функции, например. mutate
, summarise
и т. д. :) Я считаю, что это очень удобно, а не 3 строки, чтобы group_by
, сделать что-нибудь, затем ungroup
... что остается очень полезным в определенных обстоятельствах.
Должно быть сделано следующее.
library(dplyr) # load dplyr
# example data set
n <- 100
daily_mean_temp_sorted <- data.frame(
date = as.Date(seq(from=1, to=1000, length.out=n)),
mean = runif (n=n)
)
# group by year and slice
top_20_per_year <- daily_mean_temp_sorted |>
group_by(year = as.numeric(format(date, "%Y"))) |>
slice_max(mean, n = 20)
Привет! Когда вы вызываете любую функцию, не входящую в пакет
base
, обязательно укажите пакет (библиотеку), которому она принадлежит.