Ваша индексация немного не работает
impute.to.window.mean <- function(x, window) {
na.idx <- which(is.na(x)) #find missing values in x
for (na in na.idx) {
y <- sort(x[(na - window):(na + window)])
x[na] <- mean(y)
}
return(x)
}
Пройтись по примеру
set.seed(1)
x <- sample(10)
na <- 6
x[na] <- NA
# [1] 3 4 5 7 2 NA 9 6 10 1
window <- 3L
Я использовал sort
, потому что он отбрасывает NA
за один шаг; вам нужно среднее значение этого вектора, которое представляет собой все значения, попадающие в window
sort(x[(na - window):(na + window)])
# [1] 2 5 6 7 9 10
mean(sort(x[(na - window):(na + window)]))
# [1] 6.5
Проверьте свою функцию сейчас
impute.to.window.mean(x, window)
# [1] 3.0 4.0 5.0 7.0 2.0 6.5 9.0 6.0 10.0 1.0
Изменить
На самом деле, вы, вероятно, должны использовать
y <- sort(x[pmax(1L, (na - window)):pmin(length(x), (na + window))])
вместо этого для случая, когда NA
происходит, скажем, на 2, а ваше окно > 1
## current version
impute.to.window.mean(x, 10)
# Error in x[(na - window):(na + window)] :
# only 0's may be mixed with negative subscripts
## version with pmax/pmin
impute.to.window.mean(x, 10)
# [1] 3.000000 4.000000 5.000000 7.000000 2.000000 5.222222 9.000000 6.000000 10.00000 1.000000
mean(sort(x))
# [1] 5.222222
impute.to.window.mean <- function(x, window) {
na.idx <- which(is.na(x)) #find missing values in x
for (na in na.idx) {
# y <- sort(x[(na - window):(na + window)])
y <- sort(x[pmax(1L, (na - window)):pmin(length(x), (na + window))])
x[na] <- mean(y)
}
return(x)
}
person
rawr
schedule
06.02.2017