2017-08-14 5 views
1

J'ai un ensemble de données qui ressemble à ceciComment lisser séquence par foulardage avec interpolation linéaire

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) 

Je voudrais lisser la colonne de données (interpolation linéaire) par foulardage la colonne de séquence avec des numéros supplémentaires (Garder la catégorie constante). Si je devais pavé la séquence avec un seul numéro entre chaque valeur, le résultat ressemblerait à ceci:

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) 

J'ai écrit une boucle pour ce faire (rembourrage avec 20, par opposition à un), mais j'aimerais utiliser quelque chose de plus efficace.

Répondre

2

Je pense que cela fait ce que vous voulez dans la base R, en utilisant la fonction approx. Modifiez la valeur de Interval selon les besoins. Il utilise tapply pour construire une nouvelle trame de données pour chaque valeur de Category, avec une nouvelle séquence de Sequence et interpolée Data, puis les lie ensemble. Ignorer les noms de ligne.

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