【问题标题】:Converting dataframe with multiple values for one date into a ts object in R将具有多个值的数据框转换为 R 中的 ts 对象
【发布时间】:2019-04-19 02:05:03
【问题描述】:

我有一个大型数据集,其中包含特定日期的多个值。数据集中存在缺失值,因为它存在很长一段时间。这是一个小例子:

set.seed(1)
data <- data.frame(
 Date = sample(c("1993-07-09", "1993-07-09", "1993-07-10", "1993-08-11", "1993-08-11", "1993-08-11")),
 Oxygen = sample(c(0.2, 0.4, 0.4, 0.2, 0.4, 0.5))
)
data$Date <- as.Date(data$Date)

我想把这个dataframe转换成一个ts对象,这样我就可以预测,使用arima模型,最终找出异常值。

它特别需要是一个 ts 对象,而不是一个 xts 对象。

我面临的问题是: 1)我不知道如何将数据框转换为 ts 对象。 2) 创建一个 ts 对象,允许在一天内发生多个值。

任何帮助将不胜感激。谢谢!

【问题讨论】:

  • 你最终会得到很多 NA 值来将其表示为 ts/mts 类对象,因为你没有均匀分布的数据。可以吗?
  • @thelatemail 是否有替代方案不会以 NA 值结束?如果没有,我会尝试使用带有 NA 的版本。
  • 您的数据是表示同一天不同时间出现的氧气值(长数据)还是表示同一日期的不同测量值/列(宽数据)?你能提供一个你需要的输出结构的例子吗?
  • @dmca 它们代表同一日期的不同测量值/列。我需要的输出只是为了让我的数据可以识别为 ts 对象,这样当我使用异常值检测包(tsoutliers)时,它就能够运行该对象。该包仅识别时间序列而不识别数据帧。
  • 如果您想检测氧气中的异常值,那么每次对氧气需求的测量都发生在不同的时间点。由于您的数据是按日期而非日期时间键入的,因此无法区分同一天的测量值。您要么需要每天选择一个测量值,以某种方式汇总它们(如 GG 建议的那样),要么有多个具有不同异常值集的 Oxygen 时间序列(其中一些会有 NA)。

标签: r dataframe type-conversion time-series


【解决方案1】:

(1) mts ts 对象必须定期间隔(即每个连续点之间的时间量相同)并且不能表示日期(但我们可以使用数字)所以我们假设八月的日期应该是七月,因此我们有连续的日期,并且我们使用自纪元(1970 年 1 月 1 日)以来的天数作为时间。

添加序列号以区分相等的日期并将系列拆分为多列:

library(zoo)

data3 <- transform(data2, seq = ave(1:nrow(data2), Date, FUN = seq_along))
z <- read.zoo(data3, index = "Date", split = "seq")
as.ts(z)

给予:

Time Series:
Start = 8590 
End = 8592 
Frequency = 1 
       1   2   3
8590 0.5 0.4  NA
8591 0.4  NA  NA
8592 0.2 0.2 0.4

(2) 均值交替平均相同日期的值:

z2 <- read.zoo(data2, index = "Date", aggregate = mean)
as.ts(z2)

给予:

Time Series:
Start = 8590 
End = 8592 
Frequency = 1 
[1] 0.4500000 0.4000000 0.2666667

(3) 忽略日期 我们可以忽略日期列(如海报所建议的那样),在这种情况下,我们只使用 1、2、3、... 作为时间索引:

ts(data$Oxygen)

(4) 每个月的第一个点 因为,在评论中,发布者表示有很多数据(20 年),我们可以将每个月的第一个点作为月度系列.

as.ts(read.zoo(data, index = "Date", FUN = as.yearmon, aggregate = function(x) x[1]))

注意

8 月日期已更改为 7 月,以形成上面的 data2

set.seed(1)
data2 <- data.frame(
 Date = sample(c("1993-07-09", "1993-07-09", "1993-07-10", 
  "1993-07-11", "1993-07-11", "1993-07-11")),
 Oxygen = sample(c(0.2, 0.4, 0.4, 0.2, 0.4, 0.5))
)
data2$Date <- as.Date(data$Date)

【讨论】:

  • 由于我的数据不是每天均匀分布的,是否可以只使用 Oxygen 列并从中创建一个 ts 对象,然后为它补几天?这可能解决间距问题吧?
  • 我的数据集已有 20 多年的历史,并且始终存在不一致,因为我希望在查找异常值时考虑每个点,因此不能取平均值。
  • 这行得通!我的数据不优雅也不利于 ts 对象,但我要感谢您抽出宝贵时间!
  • 已移动 cmets 回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-15
  • 2016-12-28
  • 2011-06-21
  • 1970-01-01
  • 2020-06-03
  • 1970-01-01
相关资源
最近更新 更多