5

我有两个长度不同的数组

value <- c(1,1,1,4,4,4,1,1,1)
time <- c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15)

如何调整value数组的大小以使其与time数组的长度相同,并保存它的近似值?

approx()函数告诉长度不同。

我想让value数组像

value <- c(1,1,1,1,1,4,4,4,4,4,4,1,1,1,1)
time <-  c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15)

所以长度相等

UPD

好的,主要目标是计算 v1 与 v2 的相关性,其中 v1 在 data.frame v1,t1 内部,v2 在 data.frame v2,t2 内部。

v1,t1 和 v2,t2 数据帧有不同的长度,我们知道 t1 和 t2 是相同的时间段,所以我们可以覆盖它们。

对于 t1,我们有 1,3,5,7,9,对于 t2,我们有 1,2,3,4,5,6,7,8,9,10。

问题是两个数据帧是分开记录的,但同时记录,所以我需要缩放其中一个以覆盖另一个 data.frame。然后我可以计算 v1 如何影响 v2 的相关性。

这就是为什么我需要将 v1 缩放到 t2 长度。

对不起,伙计们,我不知道如何用英语正确写出目标。

4

2 回答 2

3

您可以使用 “ ”xout中的参数。approx
xout: an optional set of numeric values specifying where interpolation is to take place.

# create some fake data, which I _think_ may resemble the data you described in edit.
set.seed(123)
# "for t1 we have 1,3,5,7,9"
df1 <- data.frame(time = c(1, 3, 5, 7, 9), value = sample(1:10, 5))
df1                  

# "for t2 we have 1,2,3,4,5,6,7,8,9,10", the 'full time series'.
df2 <- data.frame(time = 1:10, value = sample(1:10))

# interpolate using approx and the xout argument
# The time values for 'full time series', df2$time, is used as `xout`.
# default values of arguments (e.g. linear interpolation, no extrapolation)
interpol1 <- with(df1, approx(x = time, y = value, xout = df2$time))

# some arguments you may wish to check
# extrapolation rules
interpol2 <- with(df1, approx(x = time, y = value, xout = df2$time,
                              rule = 2))

# interpolation method ('last observation carried forward")
interpol3 <- with(df1, approx(x = time, y = value, xout = df2$time,
                              rule = 2, method = "constant"))

df1
#   time value
# 1    1     3
# 2    3     8
# 3    5     4
# 4    7     7
# 5    9     6

interpol1
# $x
# [1]  1  2  3  4  5  6  7  8  9 10
# 
# $y
# [1] 3.0 5.5 8.0 6.0 4.0 5.5 7.0 6.5 6.0  NA

interpol3
# $x
# [1]  1  2  3  4  5  6  7  8  9 10
# 
# $y
# [1] 3 3 8 8 4 4 7 7 6 6

# correlation between a vector of inter-(extra-)polated values
# and the 'full' time series
cor.test(interpol3$y, df2$value)
于 2014-02-13T12:26:24.107 回答
2

这个小函数试图尽可能均匀地填充较短向量中的值,并且是可推广的。没有过多考虑边缘情况,我相信有很多情况会破坏它。另外,它似乎可以简化,但这是你想要做的......

pad <- function(x,y){
    fill <- length(y) - length(x)
    run <- rle(x)
    add <- fill %/% length(run$lengths)
    pad <- diff( c( 0 , as.integer( seq( add , fill , length.out = length(run$lengths) ) ) ) )
    rep(run$values , times = run$lengths+pad)
}
pad(value,time)
[1] 1 1 1 1 1 4 4 4 4 4 1 1 1 1 1

或者例如

value <- 1:2
time <- 1:10
pad(value,time)
[1] 1 1 1 1 1 2 2 2 2 2
于 2014-02-13T11:29:56.130 回答