Группировать данные во фрейме данных на основе диапазона дат во втором фрейме данных В R - PullRequest
0 голосов
/ 03 июля 2018

У меня есть следующие два фрейма данных:

Date <- seq(as.Date("2013/1/1"), by = "day", length.out = 46)
x <-data.frame(Date)
x$discharge <- c("1000","1100","1200","1300","1400","1200","1300","1300","1200","1100","1200","1200","1100","1400","1200","1100","1400","1000","1100","1200","1300","1400","1200","1300","1300","1200","1100","1200","1200","1100","1400","1200","1100","1400","1000","1100","1200","1300","1400","1200","1300","1300","1200","1100","1200","1200")
x$discharge <- as.numeric(x$discharge)

И

Date_from <- c("2013-01-01","2013-01-15","2013-01-21","2013-02-10")
Date_to <- c("2013-01-07","2013-01-20","2013-01-25","2013-02-15")
y <- data.frame(Date_from,Date_to)
y$concentration <- c("1.5","2.5","1.5","3.5")
y$Date_from <- as.Date(y$Date_from)
y$Date_to <- as.Date(y$Date_to)
y$concentration <- as.numeric(y$concentration)

Я пытаюсь вычислить средний расход по ежедневным расходам в кадре данных x для каждой строки в кадре данных y на основе диапазона дат от Date_from до Date_to в кадре данных y. Обратите внимание, что существует разрыв в измерениях в кадре данных y между 2013-01-08 по 2013-01-14 и 2013-01-26 по 2013-02-09. Этот разрыв объясняется тем, что за это время не было проведено никаких измерений. И этот разрыв вызывает у меня головную боль, так как я использовал следующий код для расчета среднего расхода для каждого диапазона дат в y:

rng <- cut(x$Date, breaks=c(y$Date_from, max(y$Date_to), 
                    include.lowest=T))
range<-cbind(x,rng)
discharge<-aggregate(cbind(mean=x$discharge)~rng, FUN=mean)

Однако, если вы проверите диапазон во фрейме данных range, диапазон с 2013-01-01 по 2013-01-07 будет расширен до 2013-01-14, но мне нужен только до 2013-01-07 и затем с перерывом, пока не начнется следующий диапазон 2013-01-15.

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Вот ответ base:

helper <- merge(x, y)
helper <- helper[helper$Date >= helper$Date_from & helper$Date <= helper$Date_to, ]
aggregate(helper$discharge,
          list(Date_from = helper$Date_from,
               Date_to = helper$Date_to),
          FUN = 'mean')

   Date_from    Date_to        x
1 2013-01-01 2013-01-07 1214.286
2 2013-01-15 2013-01-20 1166.667
3 2013-01-21 2013-01-25 1300.000
4 2013-02-10 2013-02-15 1216.667
0 голосов
/ 03 июля 2018

Вы можете попробовать tidyverse.

library(tidyverse)
y %>% 
  split(seq_along(1:nrow(.))) %>% 
  map(~filter(x, between(Date, .$Date_from, .$Date_to)) %>% 
        summarise(Mean=mean(discharge))) %>% 
  bind_rows() %>% 
  bind_cols(y,.)
   Date_from    Date_to concentration     Mean
1 2013-01-01 2013-01-07           1.5 1214.286
2 2013-01-15 2013-01-20           2.5 1166.667
3 2013-01-21 2013-01-25           1.5 1300.000
4 2013-02-10 2013-02-15           3.5 1216.667

Используя только этот код, вы можете видеть значения и группы.

y %>% 
  split(seq_along(1:nrow(.))) %>% 
  map(~filter(x, between(Date, .$Date_from, .$Date_to))) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...