Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如何将阵列扩展到另一个长度以节省它';R中的s近似值_Arrays_R_Resize_Scale_Rescale - Fatal编程技术网

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)