【问题标题】:R: Filling in data gaps with incremental value calculated from last value and next valueR:用从上一个值和下一个值计算的增量值填充数据间隙
【发布时间】:2018-03-02 22:00:08
【问题描述】:

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

这是一个非常简单的示例数据集:

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

我想创建第三列“估计”。在这个新列下:

  • 如果 Value 不为空,则 Estimate = Value。
  • 如果 Value 为空,则:(这是我遇到问题的部分!)
    • 在Value下,找到最后一个non-NA值,找到下一个non-NA值,求差
    • 取差值除以从第一个值到下一个值(包括下一个值)的空行数
    • 使用该数字,从最后一个非 NA 值到下一个非 NA 值递增地填写 Estimate 列

例如,对于时间 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)。


问题:

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

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

【问题讨论】:

标签: r


【解决方案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

【讨论】:

  • 你说得对,我想要数字......这是我的新手编码展示。感谢您的指正。您提出的解决方案正是如此。非常感谢!
猜你喜欢
  • 2023-02-14
  • 2017-08-14
  • 1970-01-01
  • 1970-01-01
  • 2019-11-09
  • 1970-01-01
  • 2023-03-29
  • 2022-08-03
  • 2023-03-14
相关资源
最近更新 更多