0

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 的非标准时间间隔。我已经查看了堆栈溢出的示例,我能找到的最接近的是这里 但无法使其工作。它将我的数据集充实到 1 分钟的数据间隔,但即使在 15 分钟的标记处,NA 也替换了我的所有数字变量。错误包括诸如 DateTime 变量未排序之类的语句。

有关链接示例的任何其他建议或更具体的指导?谢谢!!!

4

2 回答 2

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
于 2017-04-01T22:32:55.710 回答
0

a 是否full_join为您提供所需的输出?在下面的代码中,我们需要转换DATETIMEPOSIXct格式,但如果需要,您可以在之后转换回来。

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)
于 2017-03-31T20:02:09.883 回答