В R: Как агрегировать целые строки на основе максимального значения в определенном столбце по дням? - PullRequest
2 голосов
/ 10 апреля 2019

ниже приведен пример моего набора данных:

date                O3  NOX SO2
01/01/1994 06:00    7   14  29
01/01/1994 07:00    5   18  30
01/01/1994 08:00    3   18  29
01/01/1994 09:00    6   24  35
01/01/1994 10:00    20  42  52
01/02/1994 06:00    19  7   11
01/02/1994 07:00    19  6   16
01/02/1994 08:00    42  10  4
01/02/1994 09:00    25  17  26
01/02/1994 10:00    36  29  13
01/03/1994 06:00    10  1   6
01/03/1994 07:00    14  2   5
01/03/1994 08:00    24  4   4
01/03/1994 09:00    57  11  6
01/03/1994 10:00    39  34  11

Используя R, я хочу агрегировать или подгруппировать целые строки на основе максимального значения в данном столбце за день, в этом случае выбирая всю строку, содержащую максимальное значение O3 в каждый день.

Мой код объединяет только столбец и дату O3, но удаляет час, в который он был записан.

с заполнителем:

agg.df <- aggregate(df["O3"]~., format(df["date"],"%Y-%j"),max, na.rm = TRUE)

или с пакетом dplyr:

agg.df<-df %>% collapse_by("daily") %>% group_by(date) %>% summarise(O3 = max(var))

Я хочу получить что-то вроде этого:

date             O3 NOX SO2
01/01/1994 10:00 20 42  52
02/01/1994 08:00 42 10  4 
03/01/1994 09:00 57 11  6
...

Где последнее подмножество включает в себя целые строки с максимальным значением в O3 в день.

Большое спасибо.

Ответы [ 2 ]

1 голос
/ 10 апреля 2019

Рассмотрите возможность вычисления максимального значения O3 с помощью ave, а затем добавьте соответственно:

dat$Max_O3 <- with(dat, ave(O3, as.Date(date), FUN=max))

subset(dat, O3 == Max_O3)
#    O3 NOX SO2                date Max_O3
# 5  20  42  52 1994-01-01 10:00:00     20
# 8  42  10   4 1994-02-01 08:00:00     42
# 14 57  11   6 1994-03-01 09:00:00     57
0 голосов
/ 10 апреля 2019

Примечание. При этом все строки, где значение O3 равно максимальному значению этого дня, сохранятся. Если вы хотите только 1 на строку, вы можете использовать slice или top_n для этого.

library(tidyverse)

dat %>%
  group_by(day = lubridate::date(date)) %>%
  filter(O3 == max(O3)) %>% 
  ungroup %>%
  select(date, O3, NOX, SO2, -day)

# A tibble: 3 x 4
  date                   O3   NOX   SO2
  <dttm>              <int> <int> <int>
1 1994-01-01 10:00:00    20    42    52
2 1994-02-01 08:00:00    42    10     4
3 1994-03-01 09:00:00    57    11     6

данные

dat <- structure(list(O3 = c(7L, 5L, 3L, 6L, 20L, 19L, 19L, 42L, 25L, 
                             36L, 10L, 14L, 24L, 57L, 39L), NOX = c(14L, 18L, 18L, 24L, 42L, 
                                                                    7L, 6L, 10L, 17L, 29L, 1L, 2L, 4L, 11L, 34L), SO2 = c(29L, 30L, 
                                                                                                                          29L, 35L, 52L, 11L, 16L, 4L, 26L, 13L, 6L, 5L, 4L, 6L, 11L), 
                      date = structure(c(757404000, 757407600, 757411200, 757414800, 
                                         757418400, 760082400, 760086000, 760089600, 760093200, 760096800, 
                                         762501600, 762505200, 762508800, 762512400, 762516000), tzone = "UTC", class = c("POSIXct", 
                                                                                                                          "POSIXt"))), class = "data.frame", row.names = c(NA, -15L
                                                                                                                          ), .Names = c("O3", "NOX", "SO2", "date"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...