R很新,感谢您在此问题上给予我任何帮助。
我想合并两个15分钟的时间序列数据集。然后,我想在共同的x轴上绘制来自此合并数据集的变量组合。这是捕获,其中一个数据集是缺少值/日期。让我们调用数据集A和B.
A有一个日期时间列,格式为posixlt和14个数字变量(与水质相关)。读数间隔为15分钟。但是,时间序列不完整,由于设备错误而缺少一些读数。 B还有一个15分钟的间隔日期时间列,格式为posixlt和1个数字变量。然而,这个系列是连续的,即没有丢失的数据。
以下是一个缩短的示例,但数据涵盖了大约6个月,此问题始终随机重复(通知数据A缺少2:45读数):
Temp Turb DATETIME Q DATETIME
1 21 5 2017-03-19 02:00:00 1 3 2017-03-19 02:00:00
2 15 5 2017-03-19 02:15:00 2 3 2017-03-19 02:15:00
3 18 5 2017-03-19 02:30:00 3 3 2017-03-19 02:30:00
4 17 17 2017-03-19 03:00:00 4 5 2017-03-19 02:45:00
5 18 5 2017-03-19 03:15:00 5 7 2017-03-19 03:00:00
6 17 5 2017-03-19 03:30:00 6 6 2017-03-19 03:15:00
7 17 6 2017-03-19 03:45:00 7 4 2017-03-19 03:30:00
8 3 2017-03-19 03:45:00
以下是缩短示例的代码。
A<- data.frame("DATE" =c("3/19/17","3/19/17","3/19/17","3/19/17",
"3/19/17","3/19/17","3/19/17"), "TIME"=c("02:00:00","02:15:00",
"02:30:00","03:00:00","03:15:00","03:30:00","03:45:00"),
"Temp" = c(21,15,18,17,18,17,17), "Turb" = c(5,5,5,17,5,5,6))
A$DATETIME <-paste(A$DATE,A$TIME)
A$DATETIME <- strptime(A$DATETIME, "%m/%d/%y %H:%M:%S")
A<-subset( A, select = -c(DATE,TIME) )
B <- data.frame("DATE" =c("3/19/17","3/19/17","3/19/17","3/19/17",
"3/19/17","3/19/17","3/19/17","3/19/17"), "TIME"=c("02:00:00","02:15:00",
"02:30:00","02:45:00","03:00:00","03:15:00","03:30:00","03:45:00"),
"Q" = c(3,3,3,5,7,6,4,3))
B$DATETIME <-paste(B$DATE,B$TIME)
B$DATETIME <- strptime(B$DATETIME, "%m/%d/%y %H:%M:%S")
B<-subset( B, select = -c(DATE,TIME) )
我希望使用padr用空格填充A中的缺失数据,以便A和B的数值变量可以与A和B的时间交替绘制。不幸的是,15分钟是使用padr的非标准时间间隔。我已经查看了堆栈溢出的示例,我能找到的最接近的是here,但无法使其工作。它将我的数据集充实到1分钟的数据间隔,但即使在15分钟的时间内,NA也替换了我的所有数字变量。错误包括诸如DateTime变量之类的语句未排序。
关于链接示例的任何其他建议或更具体的指导?感谢!!!
答案 0 :(得分:1)
您可以使用xts解决此问题,但请记住,xts就像一个矩阵:它只能存储一种类型的数据。此外,您应该使用POSIXct
而不是POSIXlt
,除非您需要访问POSIXlt
个对象中包含的特定元素。
require(xts)
a <- xts(A[,c("Temp","Turb")], as.POSIXct(A$DATETIME))
b <- xts(B["Q"], as.POSIXct(B$DATETIME))
(x <- merge(a, b))
# Temp Turb Q
# 2017-03-19 02:00:00 21 5 3
# 2017-03-19 02:15:00 15 5 3
# 2017-03-19 02:30:00 18 5 3
# 2017-03-19 02:45:00 NA NA 5
# 2017-03-19 03:00:00 17 17 7
# 2017-03-19 03:15:00 18 5 6
# 2017-03-19 03:30:00 17 5 4
# 2017-03-19 03:45:00 17 6 3
如果需要,可以将结果转换回data.frame:
d <- data.frame(DATETIME=index(x), x)
# remove the rownames, if you want
rownames(d) <- NULL
print(d)
# DATETIME Temp Turb Q
# 1 2017-03-19 02:00:00 21 5 3
# 2 2017-03-19 02:15:00 15 5 3
# 3 2017-03-19 02:30:00 18 5 3
# 4 2017-03-19 02:45:00 NA NA 5
# 5 2017-03-19 03:00:00 17 17 7
# 6 2017-03-19 03:15:00 18 5 6
# 7 2017-03-19 03:30:00 17 5 4
# 8 2017-03-19 03:45:00 17 6 3
答案 1 :(得分:0)
full_join
是否为您提供所需的输出?在下面的代码中,我们需要将DATETIME
转换为POSIXct
格式,但如果需要,您可以在之后转换回来。
library(dplyr)
A$DATETIME = as.POSIXct(A$DATETIME)
B$DATETIME = as.POSIXct(B$DATETIME)
AB = full_join(A, B, by="DATETIME") # a dplyr function
Temp Turb DATETIME Q 1 21 5 2017-03-19 02:00:00 3 2 15 5 2017-03-19 02:15:00 3 3 18 5 2017-03-19 02:30:00 3 4 17 17 2017-03-19 03:00:00 7 5 18 5 2017-03-19 03:15:00 6 6 17 5 2017-03-19 03:30:00 4 7 17 6 2017-03-19 03:45:00 3 8 NA NA 2017-03-19 02:45:00 5
对于基数R,等价物将是:
AB = merge(A,B, by="DATETIME", all=TRUE)