R:使用从上一个值和下一个值计算的增量值填充数据缺口

问题描述 投票:1回答:1

我有两列:时间和价值。时间是连续的,没有任何空白。但是,值包括在随机点采样的数据,因此在值之间具有随机长度的数据间隙。

这是一个非常简单的样本数据集:

df <-data.frame(Time=1:10, Value=c("2", NA, NA, NA, "6", NA, NA, "7", NA, "3"))

我想创建第三列“Estimate”。在这个新专栏下:

  • 如果值不为空,则Estimate = Value。
  • 如果Value为空,则:(这是我遇到麻烦的部分!) 在“值”下,找到最后一个非NA值,找到下一个非NA值,然后找到差值 取差值并将其除以第一个值的空行数,并包括下一个值 使用该数字,从最后一个非NA值逐渐填写Estimate列到下一个非NA值

例如,对于时间2

  • 第一个值= 2(从时间1开始)
  • 下一个值= 6(从时间5开始)
  • 差异= 4
  • 增量= 4/4(因为有3个空格+时间5和记录值)
  • 因此,在时间2的估计将是第一个值+增量= 2 + 1 = 3
  • 在时间3的估计将是4,而时间4将具有估计5.类似地,时间6将是6.33,时间7将是6.66,然后时间8具有7的实际值。

基本上我只是从第一个值到下一个值进行同等加权的转换。我不关心第一个值或最后一个值之前的任何事情(如果在时间1之前或时间10之后有NA)。

问题:

作为一个新手,当价值为空时,我不太确定如何最好地为Estimate列编码。我已经尝试为具有实际值的行生成行号向量,以为我可以将其用作索引引用。然后我尝试做一个循环,它将采用行A和行B(从行号的向量),计算增量,然后将增量添加到最后一个单元格。但是,我无法弄清楚如何让A和B同时增加1(这样它在行号的矢量上做了一个“滚动窗口”)。我也怀疑这不是解决这个问题的好方法......但不知道我的选择是什么。

任何指导和指向正确的方向将不胜感激!

r
1个回答
1
投票

由于您将df $ Value中的值视为数字,因此我假设您需要数字,而不是字符串。

df <-data.frame(Time=1:10, Value=c(2, NA, NA, NA, 6, NA, NA, 7, NA, 3))

您要求的是线性插值,由R函数approxfun提供。

AF = approxfun(df[complete.cases(df),1], df[complete.cases(df),2])
ifelse(is.na(df$Value), AF(df$Time), df$Value)
 [1] 2.000000 3.000000 4.000000 5.000000 6.000000 6.333333 6.666667 7.000000
 [9] 5.000000 3.000000
© www.soinside.com 2019 - 2024. All rights reserved.