【问题标题】:Dealing with two time series with unequal intervals处理两个间隔不等的时间序列
【发布时间】:2018-11-26 12:33:28
【问题描述】:

我目前正在处理具有不同时间步长的温度测量(下图):

我想比较这两个温度并检查它们是否相互关联(Pearson 相关性)。但为此,我需要每列(temp1 和 temp2)中相同数量的值。为了进行相关性测试,我想创建一个新的数据框,其中仅包含同时生成的两个温度值(匹配值在下图中可见)。

作为输出,我想生成一个只有匹配列“time”、“temp1”和“temp2”的数据框。在这种情况下,这将只生成三个数据集,而不是总共八行。

您知道如何实现这一目标吗?

我对 R 相当陌生,并且已经搜索了解决方案,但到目前为止没有成功。提前感谢您的建议。

【问题讨论】:

  • 您好,欢迎来到 SO。首先,尽量避免在偏远地方拍摄您的数据,并尝试提供可重现的示例,以便人们可以实际尝试为您提供可行的解决方案。见stackoverflow.com/help/mcve

标签: r timestamp correlation temperature measurement


【解决方案1】:

图像 OCR 很好,但了解如何使用 dput() 以便人们更轻松地为您提供帮助。

另外:您问题中的图片 1 与图片 2 的区别不仅仅是颜色。您修改了与 R 或 R 知识无关的图像之间的时间,并且确实没有帮助/令人困惑。因此,重申建议仅将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

【讨论】:

  • 抱歉回复晚了,非常感谢您的建议。数据只是虚构的,是的,我修改了一个时间戳并忘记在第一张图片中更改它。我还是 R 的新手,并且在将来发布问题时尽量避免此类错误。我会试一试,让你知道它是否有效:)
【解决方案2】:

所以我假设您将使用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)

在这里,我将使用包dplyrdata.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 连接的信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-03
    • 2016-07-25
    • 1970-01-01
    • 2017-06-24
    • 2017-02-28
    • 1970-01-01
    相关资源
    最近更新 更多