2017-05-09 4 views
0

Ich versuche, eine Serie wie folgt zu bevölkern.R bevölkern Spalten basierend auf vorherigen Werten

   My result     ACTUAL   Expected  
FWK_SEQ_NBR a initial_d initial_c b c d  b c d 
914  9.161 131  62  0 62 69  0 62 69 
915  9.087 131  0   0 53 78  0 53 78 
916  8.772 131  0   0 44 140  0 44 87 
917  8.698 131  0   0 0 140  0 35 96 
918  7.985 131  0  69 52 139 69 96 35 
919  6.985 131  0  78 63 138 78 168 0 
920  7.077 131  0  140 126 138 87 247 0 
921  6.651 131  0  140 126 138 96 336 0 
922  6.707 131  0  139 125 138 35 364 0 

Logic

a  given 
b  lag of d by 4 
c  initial c for first week thereafter (c previous row + b current - a current) 
d  initial d - c current 

Hier ist der Code i

DS1 = DS %>% 
mutate(c = ifelse(FWK_SEQ_NBR == min(FWK_SEQ_NBR), intial_c, 0) ) %>% 
mutate(c = lag(c) + b - a)) %>% 
mutate(d = initial_d - c) %>% 
mutate(d = ifelse(d<0,0,d)) %>% 
mutate(b = shift(d, n=4, fill=0, type="lag")) 

ich die c rechts bin nicht verwendet wird, ist immer, weißt du, was mir fehlt. Ich habe auch das Bild der tatsächlichen und erwarteten Ausgabe beigefügt. Danke für Ihre Hilfe!

Actual and Expected values Image

Zweites Bild - aufgenommener Artikel und Speichern der Liste der Spalten

Image - Product and Store as the first two columns- please help

Unterhalb der eigentliche Code ist, habe ich auch das Bild der erwarteten und tatsächlichen Ausgabe kopiert. Danke!

+1

Es ist schwer zu verstehen, was Sie versuchen zu tun. Bitte bearbeiten Sie, um Beispielwerte für "a", "b", "c" und "d" anzugeben, und wie die Ausgabe aussehen soll. – Drj

+0

macht jetzt viel mehr Sinn. Danke – Drj

+0

Sind Sie sicher, dass das Problem und die Reihenfolge der Operation korrekt sind? Sie leiten "b" von "d", "c" von "b" und "a" ab, wobei "b" von "d" und dann wieder "d" von "c" abhängt. Dies wird ein Rekursionsberechnungsproblem erzeugen. – Drj

Antwort

0

Ihr Beispiel ist nicht das, was ich als reproduzierbar bezeichnen würde, und das Code-Snippet bot auch keinen Einblick in das, was Sie zu tun versuchten. Allerdings war das Bildschirmbild von Excel sehr hilfreich. Hier ist meine Lösung

df <- as.data.frame(cbind(a = c(1:9), b = 0, c = 0, d = NA)) 
c_init = 62 
d_init = 131 
df$d <- d_init 
df$c[1] <- c_init # initial data frame is ready at this stage 

iter <- dim(df)[1] # for the loop to run item times 

for(i in 1:iter){ 
    if(i>4){ 
    df[i, "b"] = df[i-4,"d"] # Calculate b with the lag 
    } 
if(i>1){ 
    df[i, "c"] = df[i-1, "c"] + df[i, "b"] - df[i, "a"] # calc c 
    } 
    df[i, "d"] <- d_init - df[i, "c"] # calc d 
    if(df[i, "d"] < 0) { 
    df[i, "d"] <- 0 # reset negative d values 
    } 
} 
+0

Das ist genau das, was ich gesucht habe. Danke vielmals!!! – S5164456135

+0

Noch eine Frage, nehmen wir an, ich habe zusätzlich zu 'FWK_SEQ_NBR' 2 weitere Variablen 'Product' und 'store', die ich zur Berechnung dieser Variablen mitsegeln muss, wie würdest du das ändern? – S5164456135

+0

Ich bin mir nicht sicher, ob ich es vollständig verstehe, aber ich denke, dass Sie fragen, ob es auch andere Spalten gibt, die die Zeilen definieren, die neu berechnet werden müssen, wie würde ich darüber gehen? Ich würde das 'df' in zwei teilen und auf die Teilmenge für verbesserte Leistung konzentrieren. Sobald es berechnet wurde, füge es wieder mit dem anderen Teil zusammen. Das ist nur ein Ansatz. Wenn Sie ein Beispiel für einen anfänglichen und erwarteten Datenrahmen haben, kann ich mit mehr Vertrauen vorschlagen. – Drj

Verwandte Themen