处理两个间隔不等的时间序列
Dealing with two time series with unequal intervals
我目前正在处理具有不同时间步长的温度测量(下图):
我想比较两个温度并检查它们是否相互关联(皮尔逊相关)。但为此,我需要在每一列(temp1 和 temp2)中使用相同数量的值。为了进行相关性测试,我想创建一个新数据框,其中仅包含同时生成的两个温度值(匹配值如下图所示)。
作为输出,我想生成一个数据框,其中仅包含匹配列 "time"、"temp1" 和 "temp2"。在这种情况下,这只会生成三个数据集,而不是总共八行。
你知道如何实现吗?
我是 R 的新手,已经搜索了解决方案,但到目前为止没有成功。提前感谢您的建议。
图像 OCR 很好,但是 请 阅读如何使用 dput()
让人们更容易帮助你。
另外:您问题中的图片 1 与图片 2 的不同之处不仅仅是颜色。您修改了与 R 或 R 知识无关的图像之间的时间,实际上是 unhelpful/confusing。因此,重申了将 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
所以我假设您会使用 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
以便 return 只有匹配的行,您阅读更多关于使用 ?join
.
的连接
我目前正在处理具有不同时间步长的温度测量(下图):
我想比较两个温度并检查它们是否相互关联(皮尔逊相关)。但为此,我需要在每一列(temp1 和 temp2)中使用相同数量的值。为了进行相关性测试,我想创建一个新数据框,其中仅包含同时生成的两个温度值(匹配值如下图所示)。
作为输出,我想生成一个数据框,其中仅包含匹配列 "time"、"temp1" 和 "temp2"。在这种情况下,这只会生成三个数据集,而不是总共八行。
你知道如何实现吗?
我是 R 的新手,已经搜索了解决方案,但到目前为止没有成功。提前感谢您的建议。
图像 OCR 很好,但是 请 阅读如何使用 dput()
让人们更容易帮助你。
另外:您问题中的图片 1 与图片 2 的不同之处不仅仅是颜色。您修改了与 R 或 R 知识无关的图像之间的时间,实际上是 unhelpful/confusing。因此,重申了将 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
所以我假设您会使用 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
以便 return 只有匹配的行,您阅读更多关于使用 ?join
.