我有两套不同机器的测量值。它们随着时间的推移以稍微不同的间隔进行测量 - 例如一个人每5分钟进行一次测量,另一个每3分钟进行一次测量。优点是每5分钟一个计算为整个区间的平均值,因此这些值应大致相互对应。我想每5分钟(Light)用测量值扩展矢量,使其值与每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分钟矢量的长度相同。
我意识到这是一个非常棘手的问题,但任何建议都会得到很好的接受。
答案 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的相关函数。
答案 1 :(得分:3)
如果我理解正确,可以使用zoo或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包,它也加载动物园。然后我们将Light
和Flux
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.xts
和merge.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