คัดลอกค่าสุดท้ายในช่วงเวลารายวัน

ฉันมีออบเจ็กต์ XTS แบบหลายวัน และฉันกำลังพยายามสร้างตัวบ่งชี้ที่เมื่อเป็นจริงแล้วจะยังคงเป็นจริงไปตลอดทั้งวัน แนวทางที่ฉันกำลังลอง (แต่ไม่ได้ผล) กำลังรวมฟังก์ชัน na.locf เข้ากับ Apply daily:

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")))

r xts
person Ed Wilson    schedule 12.05.2016    source แหล่งที่มา


คำตอบ (2)


ทางเลือกหนึ่งคือ

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
person akrun    schedule 12.05.2016
comment
มันใช้งานได้ดี คุณใช้ฟังก์ชัน ave เพียงเพื่อสับเซตหรือไม่? หรือมีเหตุผลอื่น? - person Ed Wilson; 12.05.2016
comment
@EdWilson ฟังก์ชัน ave ใช้เพื่อใช้ na.locf ในแต่ละ 'วันที่' - person akrun; 13.05.2016

ฉันคิดว่า period.apply ถูกเรียกโดย apply.daily ไม่ชอบค่าที่ส่งคืนโดย na.locf ยังไม่ได้ตรวจสอบอย่างละเอียดว่าทำไม ยังไงก็ตามฉันก็พยายามทำสิ่งที่ควรทำในลักษณะกลมๆ เห็นว่าคำตอบของอัครินทร์เหนือกว่านี้แน่นอน เหลือไว้แค่นี้..

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)
person asb    schedule 12.05.2016
comment
วิธีนี้เป็นวิธีที่ดีและเป็นแนวทาง xts ทั่วไป แม้ว่าจะสามารถบรรลุผลเต็มที่เพียงแค่ใช้ do.call(rbind, lapply(split(y, "days"), na.locf)) - person FXQuantTrader; 27.10.2016