2017-07-29 4 views
0

Ich habe einen Datenrahmen mit ein paar Spalten und ich möchte eine Zeile an den unteren Rand dieses Datenrahmens anhängen, der den gleitenden Durchschnitt der Wachstumsraten für die letzten 2 Datenzeilen enthält in jeder Spalte.R: Zeile als gleitende durchschnittliche Wachstumsrate anhängen

Daten:

A | B 
3 | 4 
4 | 3 
5 | 5 
4 | 3 
1 | 5 

Neue Zeile für Spalte A, ((1-4)/4 + (4-5)/5)/2 = -0.475 und B, 2/15.

So würde der Datenrahmen mag:

A  | B 
3  | 4 
4  | 3 
5  | 5 
4  | 3 
1  | 5 
-0.475 0.133 

Ich habe die unten versucht, aber leider ist es nicht funktioniert ich nicht einen Weg finden, kann die letzte Berechnung verwenden für jede Spalte als die neue Zeile zu verwenden, . Wie soll ich das machen?

moving_avg_growth_rate = function (x) { 
    growth = x/lag(x) - 1 
    moving_average = filter(growth, rep(1/2, 2)) 
    return (moving_average) 
} 

lapply(dataframe, moving_avg_growth_rate) 
+0

berechnen Sie die Wachstumsrate getrennt und dann 'rbind'it zum ursprünglichen df – cephalopod

Antwort

2

Hier einige Möglichkeiten:

1) betreffende Code geändertlag für Zeitreihen ist. verwenden Schwanz auch den letzten Bewegungs avg zu bekommen:

moving_avg_growth_rate = function (x) { 
    growth = x[-1]/x[-length(x)] - 1 
    moving_average = filter(growth, rep(1/2, 2), sides = 1) 
    tail(moving_average, 1) 
} 
rbind(dataframe, lapply(dataframe, moving_avg_growth_rate)) 

1a) Beachten Sie, dass, da wir wirklich nur den letzten gleitenden Durchschnitt brauchen wir

moving_avg_growth_rate2 <- function(x) { 
    xx <- tail(x, 3) 
    mean(xx[-1]/xx[-3] - 1) 
} 
rbind(dataframe, lapply(dataframe, moving_avg_growth_rate2)) 

2) kürzer

verwenden könnten
Tail <- tail(dataframe, 3) 
rbind(dataframe, colMeans(Tail[-1, ]/Tail[-3, ] - 1)) 

Hinweis: Die Eingabedaten sind in reproduzierbarer Form rm ist:

Lines <- " 
A  | B 
3  | 4 
4  | 3 
5  | 5 
4  | 3 
1  | 5" 
dataframe <- read.table(text = Lines, header = TRUE, sep = "|") 
Verwandte Themen