2017-05-09 99 views
0

我想填充這樣的一個系列。R根據以前的值填充列

   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 

邏輯

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 

下面是我用

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")) 

我沒有得到的C右邊的代碼,你知道我缺少什麼。我還附上了實際和預期產出的形象。感謝您的幫助!

Actual and Expected values Image

二圖片 - 高附加值產品和商店列

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

列表下面是實際的代碼,我也複製了預期與實際輸出的圖像。謝謝!

+1

很難理解你在做什麼。請按照適用情況編輯提供'a','b','c','d'的樣本值,然後輸出您想要的結果。 – Drj

+0

現在更有意義。謝謝 – Drj

+0

您確定,您列出的問題和操作順序是正確的嗎?你從'd',''''''''從'b'和'a'推導'b',其中'b'依賴於'd',然後再''從'c'推導。這會造成遞歸計算問題。 – Drj

回答

0

你的例子不是我稱之爲可重複的,代碼片段也沒有提供關於你想要做什麼的很多見解。但是,來自excel的屏幕圖像非常有幫助。這是我的解決方案

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

這正是我一直在尋找的。非常感謝!!! – S5164456135

+0

還有一個問題,假設我除了'FWK_SEQ_NBR'之外還有2個額外的變量'產品'和'商店',我需要順序來計算這些變量,你會如何改變這一點。 – S5164456135

+0

我不確定我是否完全理解,但是我認爲你所要問的是,如果還有其他列以及定義需要重新計算的行,我將如何處理它?我會將'df'分成兩部分,並專注於子集以提高性能。一旦計算出來就與另一部分合並。這只是一種方法。如果你有一個初始和預期的數據框架的例子,我可以建議更有信心。 – Drj