условно агрегировать столбцы с использованием Tidyverse для набора данных большого временного ряда - PullRequest
0 голосов
/ 19 февраля 2019

Изучив несколько других заданных вопросов и прочитав несколько руководств, я не могу найти подходящего решения для своей конкретной проблемы.Вот пример данных для начала:

data <- data.frame(
        Date = sample(c("1993-07-05", "1993-07-05", "1993-07-05", "1993-08-30", "1993-08-30", "1993-08-30", "1993-08-30", "1993-09-04", "1993-09-04")),
        Site = sample(c("1", "1", "1", "1", "1", "1", "1", "1", "1")),
        Station = sample(c("1", "2", "3", "1", "2", "3", "4", "1", "2")),   
        Oxygen = sample(c("0.9", "0.4", "4.2", "5.6", "7.3", "4.3", "9.5", "5.3", "0.3")))

Я хочу усреднить все значения кислорода для станций, которые вложены в сайт, который соответствует дате.В моем наборе данных есть несколько тысяч строк, и, как в примере, количество станций различно, а даты имеют разную длину.

Вывод, который я ищу, - это столбцы типа «Дата -> Сайт -> Среднее содержание кислорода», полностью исключающие необходимость в столбце станции в новой версии временного ряда.

Любая помощь будет принята с благодарностью!

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Попробуйте:

library(hablar)
library(tidyverse)

data %>% 
  retype() %>% 
  group_by(Site, Date) %>% 
  summarize(AverageOxygen = mean(Oxygen))

, что дает вам:

# A tibble: 3 x 3
# Groups:   Site [?]
   Site Date       AverageOxygen
  <int> <date>             <dbl>
1     1 1993-07-05          4.7 
2     1 1993-08-30          3.55
3     1 1993-09-04          4.75
0 голосов
/ 19 февраля 2019

После группировки по 'Site', 'Date', получите mean из 'Oxygen' (после преобразования его в numeric - это столбец factor)

library(tidyverse)
data %>%
   group_by(Site, Date) %>% 
   summarise(AverageOxygen = mean(as.numeric(as.character(Oxygen))))
# A tibble: 3 x 3
# Groups:   Site [1]
#  Site  Date       AverageOxygen
#  <fct> <fct>              <dbl>
#1 1     1993-07-05          3.97
#2 1     1993-08-30          5.2 
#3 1     1993-09-04          2.55
...