2017-09-13 23 views
4

のは、私のようなテーブルがあると仮定しましょう:R - 推定欠損値

Date  Sales 
09/01/2017 9000 
09/02/2017 12000 
09/03/2017 0 
09/04/2017 11000 
09/05/2017 14400 
09/06/2017 0 
09/07/2017 0 
09/08/2017 21000 
09/09/2017 15000 
09/10/2017 23100 
09/11/2017 0 
09/12/2017 32000 
09/13/2017 8000 

Here is what the data in the table looks like

表中の値は、私は(それは黒ですへのアクセス全くないRプログラムによって推定されています今すぐ)。今では、摂取/ ETLプロセスの問題のために陥りがちな0値の数日があります。私は0のデータで日付の値を見積もる必要があります。

我々のアプローチは、以下のとおりです。

  • が最新の欠落データに先立って、右 欠落データ
  • 推定ラインから欠落している日付の値の後に日から線を引く

2日の間にデータが欠落している唯一の日がある場合、簡単な意味が働きます。データが欠落している連続した日数が2日以上ある場合、平均値は機能しないため、複数のデータポイントの値を見積もる方法を策定しようとしています。

The intersection of the green and red lines would give the required values

Rで、このアプローチの仕事がしませんか?私はRで合計n00bだから、これが実現可能かどうかは分かりません。

+0

作品以下の回答がありますが、また 'zoo'パッケージと' na.spline'と同じことを実現することができます – CCurtis

答えて

6

関数approxfunを使用して線形補間で値を入力できます。我々はまた、imputeTSパッケージからna.interpolation機能を使用することができます

## Your data 
df = read.table(text="Date  Sales 
09/01/2017 9000 
09/02/2017 12000 
09/03/2017 0 
09/04/2017 11000 
09/05/2017 14400 
09/06/2017 0 
09/07/2017 0 
09/08/2017 21000 
09/09/2017 15000 
09/10/2017 23100 
09/11/2017 0 
09/12/2017 32000 
09/13/2017 8000", 
header=TRUE, stringsAsFactors=FALSE) 
df$Date = as.Date(df$Date, format="%m/%d/%Y") 


## Create function for linear interpolation 
Interp = approxfun(df[df$Sales > 0, ]) 

## Use function to fill in interpolated values 
Vals = Interp(df$Date[df$Sales == 0]) 
df$Sales[df$Sales == 0] = Vals 
plot(df, type="l") 
grid() 

Interpolated values

4

na.interpolationのデフォルトの方法は線形補間ですが、必要に応じて他の方法を指定することもできます。

library(dplyr) 
library(imputeTS) 

dt2 <- dt %>% 
    replace(. == 0, NA) %>% 
    mutate(Sales = na.interpolation(Sales)) 

dt2 
     Date Sales 
1 09/01/2017 9000 
2 09/02/2017 12000 
3 09/03/2017 11500 
4 09/04/2017 11000 
5 09/05/2017 14400 
6 09/06/2017 16600 
7 09/07/2017 18800 
8 09/08/2017 21000 
9 09/09/2017 15000 
10 09/10/2017 23100 
11 09/11/2017 27550 
12 09/12/2017 32000 
13 09/13/2017 8000 

データ

dt <- read.table(text = "Date  Sales 
09/01/2017 9000 
       09/02/2017 12000 
       09/03/2017 0 
       09/04/2017 11000 
       09/05/2017 14400 
       09/06/2017 0 
       09/07/2017 0 
       09/08/2017 21000 
       09/09/2017 15000 
       09/10/2017 23100 
       09/11/2017 0 
       09/12/2017 32000 
       09/13/2017 8000", 
       header = TRUE, stringsAsFactors = FALSE) 
関連する問題