2011-09-08 49 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. 

完成。