1) Нулевое заполнение . Предполагая, что фрейм данных называется DF
, мы используем rollapply
в пакете zoo для применения функции f
к движущемуся окну шириной 15
:
library(zoo)
# columns of DF are (1) Tempadjvolt, (2) newmass and (3) rgdeltas
f <- function(x) if (x[8, 3] < 0) max(x[, 1]) else x[8, 1]
DF[[1]] <- rollapply(DF, 15, f, fill = 0, by.column = FALSE)
Выше мы заполнили точки около начала и конца нулями, поскольку кажется, что точный способ справиться с этим не так важен, но мы могли бы использовать другое значение заполнения.
2) Оставить конечные значения . Другая возможность состоит в том, чтобы обрабатывать только точки, не близкие к концам:
DF[seq(8, nrow(DF)-7), 1] <- rollapply(DF, 15, f, by.column = FALSE)
3) Частичные . или мы могли бы использовать partial = TRUE
, а затем взять max
частичных значений вблизи концов следующим образом:
f2 <- function(x) {
# Columns of DF2 are (1) Tempadjvolt, (2) newmass, (3) rgdeltas and (4) seq.
# Condition is TRUE if passed a partial x near the beginning.
# k is row index of current row in x. Normally 8 but near start it varies.
k <- if (x[1, 4] == 1) nrow(x) - 7 else 8
if (x[k, 3] < 0) max(x[, 1]) else x[k, 1]
}
DF2 <- cbind(DF, seq = 1:nrow(DF))
DF[[1]] <- rollapply(DF2, 15, f2, partial = TRUE, by.column = FALSE)