Объедините и постройте данные с разным временем в 10-минутном интервале

У меня есть 3 таблицы в базе данных Access с одинаковыми именами столбцов (TempDate и Temp), но разными отметками времени. Данные собирались с 10-минутными интервалами, но каждое из записывающих устройств имело разное время запуска. Я хочу объединить их в одну таблицу с одним столбцом TempDate и одним столбцом Temp для каждой из таблиц (temp1, temp2, temp3).

Мне нужна помощь в том, как это сделать в Access или R. Я начал использовать R с кодом MySQL, но я все еще новичок в этом. Заранее спасибо. В конечном итоге я хочу присоединить эти данные к другому фрейму данных с отметкой даты и времени того же периода дат. Я думаю, что смогу с этим справиться, если кто-нибудь покажет мне, как это группировать по интервалам. Затем, наконец, постройте с помощью ggplot

Данные

    temp1<-data.frame(TempDate=c("2020/08/11 07:13:01","2020/08/11 07:23:01","2020/08/11 07:33:01","2020/08/11 07:43:01"),Temperature=c(1.610,-1.905,-1.905,-0.901))

temp2<-data.frame(TempDate=c("2020/08/11 07:10:01","2020/08/11 07:20:01","2020/08/11 07:30:01","2020/08/11 07:40:01"),Temperature=c(15.641,15.641,15.641,15.641))

temp3<-data.frame(TempDate=c("2020/08/11 07:19:01","2020/08/11 07:29:01","2020/08/11 07:39:01","2020/08/11 07:49:01"),Temperature=c(2.062,3.573,4.076,4.579))

> temp3 #as example
             TempDate Temperature
1 2020/08/11 07:19:01       2.062
2 2020/08/11 07:29:01       3.573
3 2020/08/11 07:39:01       4.076
4 2020/08/11 07:49:01       4.579

#what I want row 1 is temps recorded from 07:10:00-07:29:59, etc
> 
             TempDate    Temp1    Temp2   Temp3
1 2020/08/11 07:10:00    1.610    15.641   2.062
2 2020/08/11 07:20:00    -1.905   15.641   3.573
3 2020/08/11 07:30:00    -1.905   15.641   4.076
4 2020/08/11 07:40:00    -1.901   15.641   4.579

ОБНОВЛЕНИЕ: Спасибо Бену за отличный ответ, который помог мне приступить к решению этой проблемы. Задавая другой вопрос, было предложено floor_date. Этот код работал с моими данными лучше, чем функция вырезания @Ben. При использовании сокращения я бы получил время, заканчивающееся на 9 (12:19) вместо 0 (12:10). Я также пробовал TempDate+60 в функции вырезания, но тогда некоторые даты получали время в следующем 10-минутном интервале. Приведенный ниже код был более точным.

library(lubridate)    
tempdata<-bind_rows(burrow=burrow,shade=shade,sun=sun,.id='Series') %>%
       mutate(TempDate = as.POSIXct(TempDate, tz="UTC"),
         TimeStamp = floor_date(TempDate, unit='10 mins'),
         TimeStamp = as.POSIXct(TimeStamp, tz="UTC")) %>%
       filter(TimeStamp > as.POSIXct("2020-08-12 13:29:00", tz="UTC")) %>%
       select(Series, Temperature,TimeStamp) %>%
       arrange(TimeStamp)

person Kyle Finn    schedule 26.11.2020    source источник


Ответы (2)


В R вы можете сделать следующее, используя подход tidyverse.

Во-первых, вы можете использовать bind_rows для объединения всех ваших фреймов данных и добавить source столбец с именем фрейма данных, из которого были получены эти температуры, или столбец назначения в конечном результате.

Затем убедитесь, что ваш TempDate равен POSIXct. Вы можете использовать cut, чтобы установить даты в 10-минутные интервалы.

На этом этапе я бы подумал о том, чтобы оставить результат таким же, как и для построения с ggplot2. Часто предпочтительнее оставить длинный формат, а не широкий. Однако, если вам нужен широкий формат, вы можете использовать pivot_wider из tidyr.

library(dplyr)
library(tidyr)

bind_rows(temp1 = temp1, temp2 = temp2, temp3 = temp3, .id = 'source') %>%
  mutate(TempDate = as.POSIXct(TempDate),
         NewTempDate = cut(TempDate, breaks = "10 min")) %>%
  pivot_wider(id_cols = NewTempDate, names_from = source, values_from = Temperature)

Вывод

  NewTempDate          temp1 temp2 temp3
  <fct>                <dbl> <dbl> <dbl>
1 2020-08-11 07:10:00  1.61   15.6  2.06
2 2020-08-11 07:20:00 -1.90   15.6  3.57
3 2020-08-11 07:30:00 -1.90   15.6  4.08
4 2020-08-11 07:40:00 -0.901  15.6  4.58
person Ben    schedule 26.11.2020
comment
Привет, Бен, спасибо за это. Мне нужен график, на котором каждая температура представляет собой отдельную линию. Ваша рекомендация для длинных данных означает, что я могу просто добавить новый столбец в каждый фрейм данных для типа температуры, а затем связать их вместе. Отличная идея. - person Kyle Finn; 27.11.2020

В Access (VBA) время можно округлить следующим образом:

texttime = "2020/08/11 07:19:01"
truetime = DateValue(texttime) + TimeSerial(Hour(CDate(texttime)), (Minute(CDate(texttime)) \ 10) * 10, 0)

' Result:
' 2020-11-08 07:10:00 

Однако как это реализовать в R, я не знаю.

person Gustav    schedule 26.11.2020