我希望有人能帮助我解决这个问题。 我有两个示例数据框:
mystatusdate <- as.POSIXct(c("2016-02-01 08:05:16",
"2016-02-01 08:12:24",
"2016-02-01 08:20:16",
"2016-02-01 08:25:09",
"2016-02-01 08:36:22",
"2016-02-01 08:44:53",
"2016-02-01 08:50:25"),
tz="Europe/Berlin",
format = '%Y-%m-%d %H:%M:%S')
mystatus <- c(0, 1, 0, 1, 0, 1, 0)
mydf.status <- data.frame(mystatusdate, mystatus)
mytempdate <- as.POSIXct(c("2016-02-01 08:05:35",
"2016-02-01 08:09:43",
"2016-02-01 08:13:15",
"2016-02-01 08:15:16",
"2016-02-01 08:17:59",
"2016-02-01 08:22:09",
"2016-02-01 08:25:17",
"2016-02-01 08:28:02",
"2016-02-01 08:35:55",
"2016-02-01 08:38:32",
"2016-02-01 08:41:45",
"2016-02-01 08:43:11",
"2016-02-01 08:46:27",
"2016-02-01 08:48:47",
"2016-02-01 08:51:25"),
tz="Europe/Berlin",
format = '%Y-%m-%d %H:%M:%S')
mytemp <- c(11.4, 11.5, 14.3, 15.1, 15.0, 11.9, 14.1, 15.0, 15.3, 12.1, 12.3, 14.5, 15.1, 14.9, 12.8)
mydf.temp <- data.frame(mytempdate, mytemp)
可以使用以下代码绘制:
library(ggplot2)
ggplot() +
geom_step(data=mydf.status, aes(x=mystatusdate, y=mystatus), direction = "hv") +
geom_line(data=mydf.temp, aes(x=mytempdate, y=mytemp), colour = "red")
上面的代码创建了mydf.status,这是一个不规则的时间序列,状态为“1”或“0”,mydf.temp包含温度值,也包含不规则的时间序列。两个时间序列不同。
我现在想要创建一个新的数据框,其中我有一个mydf.temp数据框的子集,但只有mydf.status显示status ='1'的时间范围内的行。 所以结果应该是这个数据框:
myresultdate <- as.POSIXct(c("2016-02-01 08:13:15",
"2016-02-01 08:15:16",
"2016-02-01 08:17:59",
"2016-02-01 08:25:17",
"2016-02-01 08:28:02",
"2016-02-01 08:35:55",
"2016-02-01 08:46:27",
"2016-02-01 08:48:47"),
tz="Europe/Berlin",
format = '%Y-%m-%d %H:%M:%S')
myresulttemp <- c(14.3, 15.1, 15.0, 14.1, 15.0, 15.3, 15.1, 14.9)
mydf.resulttemp <- data.frame(myresultdate, myresulttemp)
也许使用下面的图表,您将更好地了解我的意思:只有蓝点应保留在结果数据框中。
ggplot() +
geom_step(data=mydf.status, aes(x=mystatusdate, y=mystatus), direction = "hv") +
geom_line(data=mydf.temp, aes(x=mytempdate, y=mytemp), colour = "red") +
geom_point(data=mydf.resulttemp, aes(x=myresultdate, y=myresulttemp), colour = "blue")
非常感谢任何帮助!
答案 0 :(得分:1)
您可以使用dplyr
按间隔过滤临时时间序列:
library(dplyr)
mydf.temp$mystatus <- 1
mydf.status %>%
mutate(dateend = lead(mystatusdate)) %>%
inner_join(mydf.temp, by = "mystatus") %>%
filter(mytempdate > mystatusdate & mytempdate <= dateend) %>%
select(mytempdate, mytemp)
#> mytempdate mytemp
#> 1 2016-02-01 08:13:15 14.3
#> 2 2016-02-01 08:15:16 15.1
#> 3 2016-02-01 08:17:59 15.0
#> 4 2016-02-01 08:25:17 14.1
#> 5 2016-02-01 08:28:02 15.0
#> 6 2016-02-01 08:35:55 15.3
#> 7 2016-02-01 08:46:27 15.1
#> 8 2016-02-01 08:48:47 14.9