【问题标题】:na.approx Interpolation in Rna.approx R中的插值
【发布时间】:2020-04-23 19:55:36
【问题描述】:

我正在使用 Zoo 的 na.approx 来填充 NA 值。

library(zoo)
Bus_data<-data.frame(Action = c("Boarding", "Alighting",NA, NA,"Boarding", "Alighting",NA, NA,"Boarding", "Alighting"),
Distance=c(1,1,2,2,3,3,4,4,5,5),
Time = c(1,2,NA,NA,5,6,NA,NA,9,10))

我希望生成的 data.frame 如下所示:

      Action Distance Time
1   Boarding        1    1
2  Alighting        1    2
3         NA        2   3.5
4         NA        2   3.5
5   Boarding        3    5
6  Alighting        3    6
7         NA        4   7.5
8         NA        4   7.5
9   Boarding        5    9
10 Alighting        5   10

但是,当我使用

na.approx(Bus_data$Time,Bus_data$Distance,ties = "ordered" )
1   Boarding        1    2 <-Value Changes
2  Alighting        1    2
3         NA        2   3.5
4         NA        2   3.5
5   Boarding        3    6 <-Value Changes
6  Alighting        3    6
7         NA        4   7.5
8         NA        4   7.5
9   Boarding        5   10 <-Value Changes
10 Alighting        5   10

知道如何通过 na.approx 获得预期的结果吗?请注意,在示例中“距离”是均匀分布的,为简化起见,数据集具有不同的距离。

【问题讨论】:

    标签: r interpolation na


    【解决方案1】:

    您可以使用 baseR 中的approx

    Time = c(1,2,NA,NA,5,6,NA,NA,9,10)
    approx(Time, method = "constant", n = length(Time), f = .5)$y
    

    结果

    # [1]  1.0  2.0  3.5  3.5  5.0  6.0  7.5  7.5  9.0 10.0
    

    来自?approx

    f: for method = "constant" 一个介于 0 和 1 之间的数字(包括 0 和 1),表示左右连续阶跃函数之间的折衷。如果 y0 和 y1 是点左侧和右侧的值,则如果 f == 0,则值为 y0,如果 f == 1,则值为 y1,中间值为 y0*(1-f)+y1*f。这样,结果对于 f == 0 是右连续的,对于 f == 1 是左连续的,即使对于非有限 y 值也是如此。


    na.approx 会很相似

    library(zoo)
    na.approx(Time, method = "constant", f = .5)
    

    【讨论】:

    • 不幸的是,我的数据在一段时间内有连续超过 2 个 NA 的实例。关于如何适应这一点有什么想法吗?
    • @FedericoTallis 你能分享模拟实际问题的虚拟数据吗?
    【解决方案2】:

    我们可以在na.approx之后将原始列的非NA元素replaceNA然后做一个coalesce

    library(dplyr)
    library(zoo)
    coalesce(Bus_data$Time, replace(na.approx(Bus_data$Time,Bus_data$Distance,
                ties = "ordered" ), 
            !is.na(Bus_data$Time), NA))
    #[1]  1.0  2.0  3.5  3.5  5.0  6.0  7.5  7.5  9.0 10.0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-10
      • 2021-02-25
      • 1970-01-01
      • 2018-04-23
      • 1970-01-01
      相关资源
      最近更新 更多