2017-08-14 37 views
1

我有一個數據組,看起來像這樣如何通過填充用線性插值

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) 

我想通過填充有附加數字序列列來平滑數據列(線性插值)平滑序列(保持類別不變)。如果我墊序列只有一個在每個值之間的數字,結果是這樣的:

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,而不是一個)但我想用更高效的東西。

回答

2

我認爲這是做你想在基地R,使用approx功能。根據需要更改Interval的值。它使用tapply爲每個值Category構建一個新的數據幀,其中新的序列爲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