2011-06-23 77 views
3

我有兩套來自不同機器的測量結果。它們隨着時間的推移以稍微不同的時間間隔(例如,每5分鐘進行一次測量,而另一次每3分鐘進行一次測量。優點是每5分鐘計算一次,作爲整個區間內的平均值,因此這些值應該大致相互對應。我想每隔5分鐘(光照)擴展矢量,使其值與每5分鐘測量的矢量值大致同步。然後,間隙應充滿先前值匹配不同長度的時間向量:棘手的一個

這裏是數據的每5分鐘

Date    Light 
26/05/2011 16:00 -529.98    
26/05/2011 16:05 -276.68    
26/05/2011 16:10 -179.63    
26/05/2011 16:15 -385.57    
26/05/2011 16:20 -1273.6    
26/05/2011 16:25 -1109.7 

和數據每3分鐘

示例
Date    Flux 
26/05/2011 16:01  0.64 
26/05/2011 16:04 -1.96 
26/05/2011 16:07 -0.51 
26/05/2011 16:10 -1.34 
26/05/2011 16:13 -1.28 
26/05/2011 16:15 -0.22 

我應該也是沒有使光量測量矢量(每5分鐘)比矢量每3分鐘更短。因此,目標是使5分鐘測量的矢量與3分鐘矢量的長度相同。

我意識到這是一個相當棘手的問題,但任何建議都會得到很好的接受。

回答

3

如果我理解正確,這很容易用動物園或xts完成。首先,這裏是你的示例數據:

Lines1 <- "Date,Light 
26/05/2011 16:00,-529.98 
26/05/2011 16:05,-276.68 
26/05/2011 16:10,-179.63 
26/05/2011 16:15,-385.57 
26/05/2011 16:20,-1273.6 
26/05/2011 16:25,-1109.7" 

Lines2 <- "Date,Flux 
26/05/2011 16:01,0.64 
26/05/2011 16:04,-1.96 
26/05/2011 16:07,-0.51 
26/05/2011 16:10,-1.34 
26/05/2011 16:13,-1.28 
26/05/2011 16:15,-0.22" 

con <- textConnection(Lines1) 
Light <- read.csv(con, stringsAsFactors=FALSE, header=TRUE) 
close(con) 
con <- textConnection(Lines2) 
Flux <- read.csv(con, stringsAsFactors=FALSE, header=TRUE) 
close(con) 

現在我們加載xts包,它也加載動物園。然後我們將LightFlux data.frame對象轉換爲xts對象。

library(xts) 
light <- xts(Light$Light, as.POSIXct(Light$Date, format="%d/%m/%Y %H:%M")) 
flux <- xts(Flux$Flux, as.POSIXct(Flux$Date, format="%d/%m/%Y %H:%M")) 

這裏是非常棒的部分。 merge.xtsmerge.zoo將按索引對齊每個系列。 na.locf用以前的值填充每個NA

Data <- merge(light,flux) 
#      light flux 
# 2011-05-26 16:00:00 -529.98 NA 
# 2011-05-26 16:01:00  NA 0.64 
# 2011-05-26 16:04:00  NA -1.96 
# 2011-05-26 16:05:00 -276.68 NA 
# 2011-05-26 16:07:00  NA -0.51 
# 2011-05-26 16:10:00 -179.63 -1.34 
# 2011-05-26 16:13:00  NA -1.28 
# 2011-05-26 16:15:00 -385.57 -0.22 
# 2011-05-26 16:20:00 -1273.60 NA 
# 2011-05-26 16:25:00 -1109.70 NA 
Data <- na.locf(Data) 

最後,我們可以從合併的Data對象中提取3分鐘索引。

Data[index(flux),] 
#      light flux 
# 2011-05-26 16:01:00 -529.98 0.64 
# 2011-05-26 16:04:00 -529.98 -1.96 
# 2011-05-26 16:07:00 -276.68 -0.51 
# 2011-05-26 16:10:00 -179.63 -1.34 
# 2011-05-26 16:13:00 -179.63 -1.28 
# 2011-05-26 16:15:00 -385.57 -0.22 
+0

+1爲動物園/ xts解釋。我打算留下一條評論,即動物園/ xts有這種內置的東西,但不太熟悉它來提供答案。 –

+0

太神奇了!謝謝 –

3

您可以使用approx,它將在您的數據點之間進行線性插值。這裏有一個簡單的例子:

x = sort(rnorm(20)) 
y = 1:20 
plot(x, y, main = 'function interpolation example') 
points(approx(x, y), col = 2, pch = 3) 

要指定你要多少點進行插值,可以使用XOUT參數,就像這樣:

points(approx(x, y, xout = seq(from = min(x), to = max(x), by = 0.1)), pch = 3, col = 3) 

更多插補點:

points(approx(x, y, xout = seq(from = min(x), to = max(x), by = 0.05)), pch = 3, col = 4) 

對於您的具體示例,您希望執行一些操作,例如使用兩臺機器的時間點的交點來插入兩個函數的x,y值。這裏有一個建議:

x_interp = unique(sort(c(seq(from = 0, to = 100, by = 5), seq(from = 0, to = 100, by = 3)))) 
x_interp 
[1] 0 3 5 6 9 10 12 15 18 20 21 24 25 27 30 33 35 
[18] 36 39 40 42 45 48 50 51 54 55 57 60 63 65 66 69 70 
[35] 72 75 78 80 81 84 85 87 90 93 95 96 99 100 

然後,您可以使用此x_interp作爲XOUT從兩臺機器點之間進行插值:

par(mfrow = c(1,2)) 
plot(x_light, y_light) 
points(approx(x_light, y_light, x_out = x_interp), col = 2, pch = 3) 

plot(x_flux, y_flux) 
points(approx(x_flux, y_flux, x_out = x_interp), col = 3, pch = 3) 

如果您想獲得其插入值的函數任意輸入,請參閱相關函數approxfun

+0

+1 for'approx()'。你的意思是使用'approxfun()'還是提到'approx()' - 代碼和你的答案的開頭部分之間有一個小的斷開? –

+0

+1這就是我所做的類似問題 –

+0

@Gavin - 偉大的一點。改變了第一行,添加了一個結束行。如果您想改善答案,請隨意編輯。 –