【问题标题】:R: how to keep legitimate NAs in a merged zoo objectR:如何在合并的动物园对象中保留合法的 NA
【发布时间】:2015-01-24 03:45:51
【问题描述】:

我有多个定时间隔为五分钟的时间序列对象,但它们可以有不同的开始时间和结束时间。他们还可以在不同的时间登录,不一定是在 5、10、15 等分钟。

我想合并这些对象,但我想保持合法的 NA 完整。例如,一个对象稍后开始记录,那么开始的 NA 是合法的 NA。如果一个对象提前停止记录也是一样的,那么最后的 NA 是合法的。

但是没有选项可以使用 na.locf 保持两个 NA 完整。

这是我的问题的一个例子:

lines1="Index,x1
2014-01-01 00:00:00,73.06
2014-01-01 00:05:00,73.11
2014-01-01 00:10:00,73.16
2014-01-01 00:15:00,73.22"

lines2="Index,x2
2014-01-01 00:11:00,71.11
2014-01-01 00:16:00,70.12
2014-01-01 00:21:00,70.16
2014-01-01 00:26:00,70.19
2014-01-01 00:31:00,69.16"

lines3="Index,x3
2014-01-01 00:23:00,0
2014-01-01 00:28:00,1
2014-01-01 00:33:00,1
2014-01-01 00:38:00,0
2014-01-01 00:43:00,0"

df1=read.table(text = lines1, header = TRUE, sep = ",")
df2=read.table(text = lines2, header = TRUE, sep = ",")
df3=read.table(text = lines3, header = TRUE, sep = ",")

z1 = zoo(df1$x1, as.POSIXct(df1$Index))
z2 = zoo(df2$x2, as.POSIXct(df2$Index))
z3 = zoo(df3$x3, as.POSIXct(df3$Index))

z = merge(z1,z2,z3)
z

z.na.locf = na.locf(z)
z.na.locf

timesteps = seq(as.POSIXct("2014-01-01 00:00:00"), 
                as.POSIXct("2014-01-01 01:00:00"),
                by = "5 min")

z.timesteps = na.locf(z, xout=timesteps)
z.timesteps

合并的对象是这样的:

> z
                       z1    z2 z3
2014-01-01 00:00:00 73.06    NA NA
2014-01-01 00:05:00 73.11    NA NA
2014-01-01 00:10:00 73.16    NA NA
2014-01-01 00:11:00    NA 71.11 NA
2014-01-01 00:15:00 73.22    NA NA
2014-01-01 00:16:00    NA 70.12 NA
2014-01-01 00:21:00    NA 70.16 NA
2014-01-01 00:23:00    NA    NA  0
2014-01-01 00:26:00    NA 70.19 NA
2014-01-01 00:28:00    NA    NA  1
2014-01-01 00:31:00    NA 69.16 NA
2014-01-01 00:33:00    NA    NA  1
2014-01-01 00:38:00    NA    NA  0
2014-01-01 00:43:00    NA    NA  0

请注意,z1 开头的 NA 是合法的,z3 的末尾也是如此,z2 的开头和结尾也是如此。需要替换的 NA 是数据中间的那些。问题是如果我尝试在数据中间填充缺失值,那么合法的 NA 也会消失:

> z.na.locf
                       z1    z2 z3
2014-01-01 00:00:00 73.06    NA NA
2014-01-01 00:05:00 73.11    NA NA
2014-01-01 00:10:00 73.16    NA NA
2014-01-01 00:11:00 73.16 71.11 NA
2014-01-01 00:15:00 73.22 71.11 NA
2014-01-01 00:16:00 73.22 70.12 NA
2014-01-01 00:21:00 73.22 70.16 NA
2014-01-01 00:23:00 73.22 70.16  0
2014-01-01 00:26:00 73.22 70.19  0
2014-01-01 00:28:00 73.22 70.19  1
2014-01-01 00:31:00 73.22 69.16  1
2014-01-01 00:33:00 73.22 69.16  1
2014-01-01 00:38:00 73.22 69.16  0
2014-01-01 00:43:00 73.22 69.16  0

请注意,对于 z1 和 z2,最后的合法 NA 已消失。

此外,如果我想重新采样数据以具有相同的常规时间戳,那么开头和结尾的 NA 也都消失了。

> z.timesteps
                       z1    z2 z3
2014-01-01 00:00:00 73.06 71.11  0
2014-01-01 00:05:00 73.11 71.11  0
2014-01-01 00:10:00 73.16 71.11  0
2014-01-01 00:15:00 73.22 71.11  0
2014-01-01 00:20:00 73.22 70.12  0
2014-01-01 00:25:00 73.22 70.16  0
2014-01-01 00:30:00 73.22 70.19  1
2014-01-01 00:35:00 73.22 69.16  1
2014-01-01 00:40:00 73.22 69.16  0
2014-01-01 00:45:00 73.22 69.16  0
2014-01-01 00:50:00 73.22 69.16  0
2014-01-01 00:55:00 73.22 69.16  0
2014-01-01 01:00:00 73.22 69.16  0

有什么方法可以实现我的需要吗?感谢您的帮助。

【问题讨论】:

    标签: r merge zoo


    【解决方案1】:

    na.fill 可以在这里提供帮助。以下代码行将在开头和结尾保留 NA 的运行,但使用 na.locf 填充剩余的 NA:

    zz <- na.locf(z, na.rm = FALSE) + 0 * na.fill(z, fill = c(NA, 0, NA))
    

    给予:

    > zz
                           z1    z2 z3
    2014-01-01 00:00:00 73.06    NA NA
    2014-01-01 00:05:00 73.11    NA NA
    2014-01-01 00:10:00 73.16    NA NA
    2014-01-01 00:11:00 73.16 71.11 NA
    2014-01-01 00:15:00 73.22 71.11 NA
    2014-01-01 00:16:00    NA 70.12 NA
    2014-01-01 00:21:00    NA 70.16 NA
    2014-01-01 00:23:00    NA 70.16  0
    2014-01-01 00:26:00    NA 70.19  0
    2014-01-01 00:28:00    NA 70.19  1
    2014-01-01 00:31:00    NA 69.16  1
    2014-01-01 00:33:00    NA    NA  1
    2014-01-01 00:38:00    NA    NA  0
    2014-01-01 00:43:00    NA    NA  0
    

    注意 1: 我们可以将 read.table / zoo 行减少为以下形式的三行:

    z1 <- read.zoo(text = lines1, header = TRUE, sep = ",", tz = "")
    

    注意2:也许你接下来想做的是:

    timesteps <- seq(start(zz), start(zz) + 3600, by = "5 min")
    m <- merge(zz, zoo(, timesteps))
    m.na <- na.locf(m, na.rm = FALSE) + 0 * na.fill(m, fill = c(NA, 0, NA))
    window(m.na, timesteps)
    

    【讨论】:

    • 我期望的最终结果应该是以时间步长为索引的重新采样的动物园对象。我尝试将xout=timesteps 放在na.locfna.fill 中,但它不起作用。
    • 我添加了一个Note 2,以防您正在寻找。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-14
    • 1970-01-01
    • 2015-02-16
    • 1970-01-01
    • 2012-02-27
    • 1970-01-01
    • 2013-05-15
    相关资源
    最近更新 更多