Работа с двумя временными рядами с неравными интервалами - PullRequest
0 голосов
/ 26 ноября 2018

В настоящее время я имею дело с измерениями температуры, которые имеют разные временные шаги (рисунок ниже):

temperatures vs time

Я хочу сравнить две температуры и проверить, коррелируют ли они друг с другом(Корреляции Пирсона).Но для этого мне нужно одинаковое количество значений в каждом столбце (temp1 и temp2).Чтобы выполнить корреляционный тест, я хочу создать новый фрейм данных, который включает только два значения температуры, которые были сгенерированы одновременно (совпадающие значения, показанные на рисунке ниже).

temperatures vs time, 2

В качестве вывода я хочу сгенерировать фрейм данных, в котором есть только совпадающие столбцы "time", "temp1" и "temp2".В этом случае это будет только три набора данных вместо восьми строк.

wished output file

У вас есть идея, как этого добиться?

Я довольно новичок в R и уже искал решение, но пока безуспешно.Заранее спасибо за ваши предложения.

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Так что я бы предположил, что вы использовали бы VLOOKUP для создания этого в Microsoft Excel.В R это работает по-разному, мы объединяем обе таблицы по времени (time1 & time2), чтобы получить один столбец.

Сначала давайте создадим данные, которые выглядят как ваши.

T <- seq.POSIXt(Sys.time() - 3600, Sys.time(), by = "min")

temp1 <- data.frame(
    time1 = sample(T, 32),
    temp1 = runif(32, -20, 60)
)

temp2 <- data.frame(
    time2 = sample(T, 32),
    temp2 = runif(32, -20, 60)
)

head(temp1)

Здесь я буду использовать пакет dplyr для объединения data.frame (таблиц) вместе.Если у вас еще не установлен этот пакет, сделайте это с помощью: install.packages("dplyr")

# load the package after install
library(dplyr)

# merge
merged <- inner_join(temp1, temp2, by = c("time1" = "time2"))

# correlate
cor(merged$temp1, merged$temp2, method = "pearson")

Выше я использовал inner_join, чтобы возвращать только совпадающие строки, вы узнаете больше о соединениях с ?join.

0 голосов
/ 26 ноября 2018

Изображение распознается хорошо, но , пожалуйста, , прочитайте о том, как использовать dput(), чтобы людям было легче помочь.

ТАКЖЕ: изображение 1 в вашем вопросе отличаетсяиз изображения 2 более чем на цвет.Вы изменили время между изображениями, которое не имеет ничего общего с R или R knowledgfe и действительно бесполезно / сбивает с толку.Отсюда повторное предложение просто использовать вывод dput в блок кода.

0 база внешних зависимостей R решение:

read.csv(text="temp1,time1,temp2,time2
21.875,01.11.18 01:54,22.500,01.11.18 01:40
21.875,01.11.18 01:57,22.563,01.11.18 01:41
21.813,01.11.18 01:58,22.563,01.11.18 01:51
21.875,01.11.18 01:59,22.625,01.11.18 01:52
21.875,01.11.18 02:03,22.563,01.11.18 01:53
21.813,01.11.18 02:04,22.625,01.11.18 01:54
21.875,01.11.18 02:05,22.625,01.11.18 02:05
21.813,01.11.18 02:06,22.688,01.11.18 02:06",
         stringsAsFactors=FALSE) -> xdf

xdf$time1 <- as.POSIXct(xdf$time1, format="%m.%d.%y %H:%M")
xdf$time2 <- as.POSIXct(xdf$time2, format="%m.%d.%y %H:%M")

setNames(
  merge(xdf[,1:2], xdf[,3:4], by.x="time1", by.y="time2"),
  c("time", "temp1", "temp2")
)
##                  time  temp1  temp2
## 1 2018-01-11 01:54:00 21.875 22.625
## 2 2018-01-11 02:05:00 21.875 22.625
## 3 2018-01-11 02:06:00 21.813 22.688

57 скомпилировано ? зависимость tidyverse решение:

  read.csv(text="temp1,time1,temp2,time2
  21.875,01.11.18 01:54,22.500,01.11.18 01:40
  21.875,01.11.18 01:57,22.563,01.11.18 01:41
  21.813,01.11.18 01:58,22.563,01.11.18 01:51
  21.875,01.11.18 01:59,22.625,01.11.18 01:52
  21.875,01.11.18 02:03,22.563,01.11.18 01:53
  21.813,01.11.18 02:04,22.625,01.11.18 01:54
  21.875,01.11.18 02:05,22.625,01.11.18 02:05
  21.813,01.11.18 02:06,22.688,01.11.18 02:06",
           stringsAsFactors=FALSE) -> xdf

  library(tidyverse)

  mutate(xdf, time1 = lubridate::mdy_hm(time1)) %>%
    mutate(time2 = lubridate::mdy_hm(time2)) -> xdf

  left_join(
    select(xdf, temp1, time1),
    select(xdf, temp2, time2),
    by = c("time1" = "time2")
  ) %>%
    filter(!is.na(temp2)) %>%
    select(time = time1, temp1, temp2)
  ##                  time  temp1  temp2
  ## 1 2018-01-11 01:54:00 21.875 22.625
  ## 2 2018-01-11 02:05:00 21.875 22.625
  ## 3 2018-01-11 02:06:00 21.813 22.688
...