如何通过线性插值填充来平滑序列

时间:2017-08-14 14:20:24

标签: r interpolation smoothing

我有一个看起来像这样的数据集

Category<-c(1,1,1,1,1,2,2,2,2,2,3,3,3,3,3)
Sequence<-c(1,2,3,4,5,1,2,3,4,5,1,2,3,4,5)
Data<-c(2,3,4,5,6,4,5,6,7,6,5,4,3,2,4)

DF<-data.frame(Category,Sequence,Data)

我想通过在Sequence列中填充其他数字(保持Category不变)来平滑数据列(线性插值)。如果我在每个值之间填充序列只有一个数字,结果将如下所示:

NewCat<-c(1,1,1,1,1,1,1,1,1,2,2,2,2,2,2)
NewSeq<-c(1,1.5,2,2.5,3,3.5,4,4.5,5,1,1.5,2,2.5,3,3.5)
NewData<-c(2,2.5,3,3.5,4,4.5,5,5.5,6,4,4.5,5,5.5,6,6.5)
NewDF<-data.frame(NewCat,NewSeq,NewData)

我已经编写了一个for循环来执行此操作(使用20而不是一个填充),但我想使用更高效的东西。

1 个答案:

答案 0 :(得分:2)

我认为这可以使用approx函数在Base R中执行您想要的操作。根据需要更改Interval的值。它使用tapplyCategory的每个值构建一个新数据框,使用新的Sequence序列和插值Data,然后将它们绑定在一起。忽略行名称。

Interval <- 0.5
NewDF <- do.call(rbind,
      tapply(seq_along(DF$Sequence), DF$Category, function(x) {
           Seqvals <- seq(min(DF$Sequence[x]), max(DF$Sequence[x]), Interval)
           Intvals <- approx(DF$Sequence[x], DF$Data[x], Seqvals)$y
           return(data.frame(Category=DF$Category[min(x)],
                             Sequence=Seqvals,
                             Data=Intvals))}))
NewDF
    Category Sequence Data
1.1        1      1.0  2.0
1.2        1      1.5  2.5
1.3        1      2.0  3.0
1.4        1      2.5  3.5
1.5        1      3.0  4.0
1.6        1      3.5  4.5
1.7        1      4.0  5.0
1.8        1      4.5  5.5
1.9        1      5.0  6.0
2.1        2      1.0  4.0
2.2        2      1.5  4.5
2.3        2      2.0  5.0
2.4        2      2.5  5.5
2.5        2      3.0  6.0
2.6        2      3.5  6.5
2.7        2      4.0  7.0
2.8        2      4.5  6.5
2.9        2      5.0  6.0
3.1        3      1.0  5.0
3.2        3      1.5  4.5
3.3        3      2.0  4.0
3.4        3      2.5  3.5
3.5        3      3.0  3.0
3.6        3      3.5  2.5
3.7        3      4.0  2.0
3.8        3      4.5  3.0
3.9        3      5.0  4.0