在每天的时间段内复制最后一个值
Copy down last value over a daily period
我有一个多日 XTS 对象,我正在尝试创建一个指标,该指标一旦为真,就在当天的剩余时间内保持为真。我正在尝试(但它不起作用)的方法是将 na.locf 函数与每日应用相结合:
output <- apply.daily(x, na.locf)
可重现代码:
y <- as.xts(c(NA,NA,1,NA,NA,NA,NA,NA,NA),as.POSIXct(c(
"2010-01-05 00:00:00", "2010-01-05 00:04:00", "2010-01-05 00:08:00",
"2010-01-05 00:12:00", "2010-01-05 00:16:00", "2010-01-05 00:20:00",
"2010-01-06 00:00:00", "2010-01-06 00:04:00", "2010-01-06 00:08:00")))
期望的输出是在当天剩下的时间里抄下“1”。所以:
y <- as.xts(c(NA,NA,1,1,1,1,NA,NA,NA),as.POSIXct(c(
"2010-01-05 00:00:00", "2010-01-05 00:04:00", "2010-01-05 00:08:00",
"2010-01-05 00:12:00", "2010-01-05 00:16:00", "2010-01-05 00:20:00",
"2010-01-06 00:00:00", "2010-01-06 00:04:00", "2010-01-06 00:08:00")))
一个选项是
y1 <- ave(y, as.Date(index(y)), FUN= function(x) na.locf(x, na.rm=FALSE))
y1
# [,1]
#2010-01-05 00:00:00 NA
#2010-01-05 00:04:00 NA
#2010-01-05 00:08:00 1
#2010-01-05 00:12:00 1
#2010-01-05 00:16:00 1
#2010-01-05 00:20:00 1
#2010-01-06 00:00:00 NA
#2010-01-06 00:04:00 NA
#2010-01-06 00:08:00 NA
str(y1)
# An ‘xts’ object on 2010-01-05/2010-01-06 00:08:00 containing:
# Data: num [1:9, 1] NA NA 1 1 1 1 NA NA NA
# Indexed by objects of class: [POSIXct,POSIXt] TZ:
# Original class: 'double'
# xts Attributes:
# NULL
str(y)
#An ‘xts’ object on 2010-01-05/2010-01-06 00:08:00 containing:
# Data: num [1:9, 1] NA NA 1 NA NA NA NA NA NA
# Indexed by objects of class: [POSIXct,POSIXt] TZ:
# Original class: 'double'
# xts Attributes:
# NULL
我认为 apply.daily
调用的 period.apply
不喜欢 na.locf
返回的值。还没有很彻底地调查为什么。反正我是尽量迂回的去做它应该做的事情。看得出来akrun的回答肯定比这个优越。就把这个留在这里。
R> y <- as.xts(c(NA,NA,1,NA,NA,NA,NA,NA,NA),
+ as.POSIXct(c("2010-01-05 00:00:00", "2010-01-05 00:04:00",
+ "2010-01-05 00:08:00", "2010-01-05 00:12:00",
+ "2010-01-05 00:16:00", "2010-01-05 00:20:00",
+ "2010-01-06 00:00:00", "2010-01-06 00:04:00",
+ "2010-01-06 00:08:00")))
R> endpoints(y, "days")
[1] 0 6 9
R> ep <- endpoints(y, "days")
R> diff(ep)
[1] 6 3
R> dep <- diff(ep)
R> rep.int(1:length(dep), times=dep)
[1] 1 1 1 1 1 1 2 2 2
R> runs <- rep.int(1:length(dep), times=dep)
R> lapply(split(y, runs), na.locf, na.rm=FALSE)
$`1`
2010-01-05 00:00:00 NA
2010-01-05 00:04:00 NA
2010-01-05 00:08:00 1
2010-01-05 00:12:00 1
2010-01-05 00:16:00 1
2010-01-05 00:20:00 1
$`2`
2010-01-06 00:00:00 NA
2010-01-06 00:04:00 NA
2010-01-06 00:08:00 NA
R> splits <- lapply(split(y, runs), na.locf, na.rm=FALSE)
R> do.call('rbind', splits)
2010-01-05 00:00:00 NA
2010-01-05 00:04:00 NA
2010-01-05 00:08:00 1
2010-01-05 00:12:00 1
2010-01-05 00:16:00 1
2010-01-05 00:20:00 1
2010-01-06 00:00:00 NA
2010-01-06 00:04:00 NA
2010-01-06 00:08:00 NA
R> ynew <- do.call('rbind', splits)
我有一个多日 XTS 对象,我正在尝试创建一个指标,该指标一旦为真,就在当天的剩余时间内保持为真。我正在尝试(但它不起作用)的方法是将 na.locf 函数与每日应用相结合:
output <- apply.daily(x, na.locf)
可重现代码:
y <- as.xts(c(NA,NA,1,NA,NA,NA,NA,NA,NA),as.POSIXct(c(
"2010-01-05 00:00:00", "2010-01-05 00:04:00", "2010-01-05 00:08:00",
"2010-01-05 00:12:00", "2010-01-05 00:16:00", "2010-01-05 00:20:00",
"2010-01-06 00:00:00", "2010-01-06 00:04:00", "2010-01-06 00:08:00")))
期望的输出是在当天剩下的时间里抄下“1”。所以:
y <- as.xts(c(NA,NA,1,1,1,1,NA,NA,NA),as.POSIXct(c(
"2010-01-05 00:00:00", "2010-01-05 00:04:00", "2010-01-05 00:08:00",
"2010-01-05 00:12:00", "2010-01-05 00:16:00", "2010-01-05 00:20:00",
"2010-01-06 00:00:00", "2010-01-06 00:04:00", "2010-01-06 00:08:00")))
一个选项是
y1 <- ave(y, as.Date(index(y)), FUN= function(x) na.locf(x, na.rm=FALSE))
y1
# [,1]
#2010-01-05 00:00:00 NA
#2010-01-05 00:04:00 NA
#2010-01-05 00:08:00 1
#2010-01-05 00:12:00 1
#2010-01-05 00:16:00 1
#2010-01-05 00:20:00 1
#2010-01-06 00:00:00 NA
#2010-01-06 00:04:00 NA
#2010-01-06 00:08:00 NA
str(y1)
# An ‘xts’ object on 2010-01-05/2010-01-06 00:08:00 containing:
# Data: num [1:9, 1] NA NA 1 1 1 1 NA NA NA
# Indexed by objects of class: [POSIXct,POSIXt] TZ:
# Original class: 'double'
# xts Attributes:
# NULL
str(y)
#An ‘xts’ object on 2010-01-05/2010-01-06 00:08:00 containing:
# Data: num [1:9, 1] NA NA 1 NA NA NA NA NA NA
# Indexed by objects of class: [POSIXct,POSIXt] TZ:
# Original class: 'double'
# xts Attributes:
# NULL
我认为 apply.daily
调用的 period.apply
不喜欢 na.locf
返回的值。还没有很彻底地调查为什么。反正我是尽量迂回的去做它应该做的事情。看得出来akrun的回答肯定比这个优越。就把这个留在这里。
R> y <- as.xts(c(NA,NA,1,NA,NA,NA,NA,NA,NA),
+ as.POSIXct(c("2010-01-05 00:00:00", "2010-01-05 00:04:00",
+ "2010-01-05 00:08:00", "2010-01-05 00:12:00",
+ "2010-01-05 00:16:00", "2010-01-05 00:20:00",
+ "2010-01-06 00:00:00", "2010-01-06 00:04:00",
+ "2010-01-06 00:08:00")))
R> endpoints(y, "days")
[1] 0 6 9
R> ep <- endpoints(y, "days")
R> diff(ep)
[1] 6 3
R> dep <- diff(ep)
R> rep.int(1:length(dep), times=dep)
[1] 1 1 1 1 1 1 2 2 2
R> runs <- rep.int(1:length(dep), times=dep)
R> lapply(split(y, runs), na.locf, na.rm=FALSE)
$`1`
2010-01-05 00:00:00 NA
2010-01-05 00:04:00 NA
2010-01-05 00:08:00 1
2010-01-05 00:12:00 1
2010-01-05 00:16:00 1
2010-01-05 00:20:00 1
$`2`
2010-01-06 00:00:00 NA
2010-01-06 00:04:00 NA
2010-01-06 00:08:00 NA
R> splits <- lapply(split(y, runs), na.locf, na.rm=FALSE)
R> do.call('rbind', splits)
2010-01-05 00:00:00 NA
2010-01-05 00:04:00 NA
2010-01-05 00:08:00 1
2010-01-05 00:12:00 1
2010-01-05 00:16:00 1
2010-01-05 00:20:00 1
2010-01-06 00:00:00 NA
2010-01-06 00:04:00 NA
2010-01-06 00:08:00 NA
R> ynew <- do.call('rbind', splits)