2017-02-06 8 views
3

私はRが新しく、問題に苦しんでいます。ROUTINGの値が欠落しているR

与えられたサイズのウィンドウ内の要素の平均値に従って、ベクトルの欠損値を代入する関数が必要です。

私のNAが30位にあり、ウィンドウサイズが10であるため、平均値はx[20:40]と計算されるため、このウィンドウが移動します。したがって、それぞれがNAであると、ウィンドウ平均は異なり​​ます。

impute.to.window.mean <- function(x, window) { 

    na.idx <- is.na(x) #find missing values in x 

    for (na in na.idx) { 

    y <- (x[na]-window):(x[na]+window) 
    na.idx[na] <- mean(y, na.rm = TRUE) 
    } 

    return(x) 
} 

をが、それは正しくないと私は継続するのか分からない:

は、私はこれをしようとしています。

答えて

1

imputeTSパッケージを使用することをおすすめします。

x <- rnorm(100) 
x[c(7, 21, 33)] <- NA 

imputeTS::na.ma(x, k = 4, weighting = "simple") 
0

R塩基と:ここで4の単純移動平均と窓との値を埋めるの一例である

df <- data.frame(x = sample(c(1:10,NA),1000, replace = T)) 
window <- 10 

lapply(1:(nrow(df)-window), function(x) ifelse(is.na(df[x,'x']),mean(df[x:(x+10),'x'],na.rm=T),df[x,'x'])) 

のみ差私は今値に対して前方に見えることがあります。しかし、それをあなたの仕様に変えることができます。

0

あなたのインデックスは、1つのステップでNA Sをドロップするので、私はsortを使用

set.seed(1) 
x <- sample(10) 
na <- 6 
x[na] <- NA 
# [1] 3 4 5 7 2 NA 9 6 10 1 

window <- 3L 

例を通じてオフ

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

ウォーク少しです。 [編集は、おそらく使用する必要があり、実際に

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 

window

sort(x[(na - window):(na + window)]) 
# [1] 2 5 6 7 9 10 

mean(sort(x[(na - window):(na + window)])) 
# [1] 6.5 

に入るすべての値であり、このベクトルの平均があなたの機能をテストし

たい

y <- sort(x[pmax(1L, (na - window)):pmin(length(x), (na + window))]) 
代わりNAは2、たとえば、で発生した場合の

、そしてあなたの窓は、動物園:: rollapplyこれは1つのステートメントで行うことができますを使用して> 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) 
} 
1

です。

library(zoo) 

x <- replace(1:20, c(4, 6, 10, 15), NA) # test data 


rollapply(c(NA, NA, x, NA, NA), 5, 
    function(x) if (is.na(x[3])) mean(x, na.rm = TRUE) else x[3]) 

を与える:

[1] 1.000000 2.000000 3.000000 3.333333 5.000000 6.666667 7.000000 
[8] 8.000000 9.000000 10.000000 11.000000 12.000000 13.000000 14.000000 
[15] 15.000000 16.000000 17.000000 18.000000 19.000000 20.000000 
我々は、この例のために(現在の点のいずれかの側の2)長さ5のウィンドウを使用しています
関連する問題