Arrays 如何将阵列扩展到另一个长度以节省它';R中的s近似值
我有两个不同长度的数组Arrays 如何将阵列扩展到另一个长度以节省它';R中的s近似值,arrays,r,resize,scale,rescale,Arrays,R,Resize,Scale,Rescale,我有两个不同长度的数组 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) 所以长度是相等的 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,我
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)
所以长度是相等的
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长度的原因
对不起,伙计们,我不知道如何用英语正确地写下目标 这个小函数尝试将较短向量中的值尽可能均匀地填充出来,并且是通用的。我没有过多考虑边缘案例,我相信有很多案例打破了它。此外,它似乎可以简化,但这是你正在寻找做的
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
pad您可以使用近似值中的xout
参数
“xout:一组可选的数值,指定插值发生的位置。
”
#创建一些虚假数据,我认为这些数据可能与您在编辑中描述的数据相似。
种子集(123)
#“对于t1,我们有1,3,5,7,9”
df1“保存近似值”是什么意思?您可以通过rep_len(值、长度(时间))
简单地回收value
。您需要更具体一些。哪些值要附加到“value”中?我只是不明白如何用英语来表达,谢谢。对不起,我不明白在“value”中附加哪些数字的基本规则;前三个“1”变为五个“1”;三个"四",六个"四",;最后三个“1”->四个“1”。不应该将value
拉伸到每个数字重复5次<代码>(3/9)*15=5
?
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
# 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)