2011-09-08 92 views
4

我有像這樣一個數據幀:填補空白的時間序列與平均

day   sum_flux samples mean 
2005-10-26  0.02  48 0.02 
2005-10-27  0.12  12 0.50 

這是一系列的日常閱讀的跨越5年時間,但有些天失蹤。我想填補這些日子與其他年份的平均月份。

即即使26-10-2005失蹤我想使用數據集中所有Octobers的平均值。 如果10月份的所有人都不見了,我想將這個平均值應用到每個缺失的日子。

我想我需要建立一個函數(可能使用plyr)來評估這些日子。但是,我對R中使用各種時間序列對象以及有條件地對數據進行子集並且希望得到一些建議的經驗非常缺乏。特別是關於我應該使用哪種類型的時間序列。

很多謝謝

+2

通過這樣做,你會假設沒有趨勢,也就是說,每年都有與其他人相似的價值觀。你確定你相信嗎? –

+0

另外,您想要將平均值應用於「sum_flux」還是「mean」的列? –

回答

6

一些示例數據。我假設sum_flux是缺少值的列,並且您要爲其計算值。

library(lubridate) 
days <- seq.POSIXt(ymd("2005-10-26"), ymd("2010-10-26"), by = "1 day") 
n_days <- length(days) 
readings <- data.frame(
    day  = days, 
    sum_flux = runif(n_days), 
    samples = sample(100, n_days, replace = TRUE), 
    mean  = runif(n_days) 
) 
readings$sum_flux[sample(n_days, floor(n_days/10))] <- NA 

添加一個月欄。

readings$month <- month(readings$day, label = TRUE) 

使用tapply來獲得月平均通量。

monthly_avg_flux <- with(readings, tapply(sum_flux, month, mean, na.rm = TRUE)) 

無論何時通量缺失都使用此值,否則保持通量。

readings$sum_flux2 <- with(readings, ifelse(
    is.na(sum_flux), 
    monthly_avg_flux[month], 
    sum_flux 
)) 
+0

+1爲lubridate並在您的評論中指出效果 –

+0

非常感謝Richie,對延遲迴復感到抱歉。 RE:假設沒有趨勢,通常每年的變化大於任何可測量的趨勢(時間序列太短)。 – BetaScoo8

+0

剛剛跑過數據,正是我在找的,再次感謝。 – BetaScoo8

2

這是一個(非常快)的方式在data.table

從裏奇使用很好的例子數據:

require(data.table) 
days <- seq(as.IDate("2005-10-26"), as.IDate("2010-10-26"), by = "1 day") 
n_days <- length(days) 
readings <- data.table(
    day  = days, 
    sum_flux = runif(n_days), 
    samples = sample(100, n_days, replace = TRUE), 
    mean  = runif(n_days) 
) 
readings$sum_flux[sample(n_days, floor(n_days/10))] <- NA 
readings 
      day sum_flux samples  mean 
[1,] 2005-10-26 0.32838686  94 0.09647325 
[2,] 2005-10-27 0.14686591  88 0.48728321 
[3,] 2005-10-28 0.25800913  51 0.72776002 
[4,] 2005-10-29 0.09628937  81 0.80954124 
[5,] 2005-10-30 0.70721591  23 0.60165240 
[6,] 2005-10-31 0.59555079  2 0.96849533 
[7,] 2005-11-01   NA  42 0.37566491 
[8,] 2005-11-02 0.01649860  89 0.48866220 
[9,] 2005-11-03 0.46802818  49 0.28920807 
[10,] 2005-11-04 0.13024856  30 0.29051080 
First 10 rows of 1827 printed. 

創建每月的平均,各組出現的順序:

> avg = readings[,mean(sum_flux,na.rm=TRUE),by=list(mnth = month(day))] 
> avg 
     mnth  V1 
[1,] 10 0.4915999 
[2,] 11 0.5107873 
[3,] 12 0.4451787 
[4,] 1 0.4966040 
[5,] 2 0.4972244 
[6,] 3 0.4952821 
[7,] 4 0.5106539 
[8,] 5 0.4717122 
[9,] 6 0.5110490 
[10,] 7 0.4507383 
[11,] 8 0.4680827 
[12,] 9 0.5150618 

下一頁訂貨avg一月開始:

avg = avg[order(mnth)] 
avg 
     mnth  V1 
[1,] 1 0.4966040 
[2,] 2 0.4972244 
[3,] 3 0.4952821 
[4,] 4 0.5106539 
[5,] 5 0.4717122 
[6,] 6 0.5110490 
[7,] 7 0.4507383 
[8,] 8 0.4680827 
[9,] 9 0.5150618 
[10,] 10 0.4915999 
[11,] 11 0.5107873 
[12,] 12 0.4451787 

現通過參考更新(:=sum_flux列,其中sum_fluxNA,其值爲avg

readings[is.na(sum_flux), sum_flux:=avg$V1[month(day)]] 
      day sum_flux samples  mean 
[1,] 2005-10-26 0.32838686  94 0.09647325 
[2,] 2005-10-27 0.14686591  88 0.48728321 
[3,] 2005-10-28 0.25800913  51 0.72776002 
[4,] 2005-10-29 0.09628937  81 0.80954124 
[5,] 2005-10-30 0.70721591  23 0.60165240 
[6,] 2005-10-31 0.59555079  2 0.96849533 
[7,] 2005-11-01 0.51078729** 42 0.37566491 # ** updated with the Nov avg 
[8,] 2005-11-02 0.01649860  89 0.48866220 
[9,] 2005-11-03 0.46802818  49 0.28920807 
[10,] 2005-11-04 0.13024856  30 0.29051080 
First 10 rows of 1827 printed. 

完成。