我正在嘗試對依賴於組內兩個先前元素的分組數據執行迭代計算。作爲一個玩具的例子:dplyr group_by和迭代循環計算
set.seed(100)
df = data.table(ID = c(rep("A_index1",9)),
Year = c(2001:2005, 2001:2004),
Price = c(NA, NA, 10, NA, NA, 15, NA, 13, NA),
Index = sample(seq(1, 3, by = 0.5), size = 9, replace = TRUE))
ID Year Price Index
R> df
1: A_index1 2001 NA 1.5
2: A_index1 2002 NA 1.5
3: A_index1 2003 10 2.0
4: A_index1 2004 NA 1.0
5: A_index1 2005 NA 2.0
6: A_index1 2006 15 2.0
7: A_index1 2007 NA 3.0
8: A_index1 2008 13 1.5
9: A_index1 2009 NA 2.0
其目標是填補缺失的價格使用最後的可用價格和指數進行調整。我有一個循環執行這些計算,我試圖使用dplyr
進行矢量化。
我的邏輯是在下面的循環定義:
df$Price_adj = df$Price
for (i in 2:nrow(df)) {
if (is.na(df$Price[i])) {
df$Price_adj[i] = round(df$Price_adj[i-1] * df$Index[i]/df$Index[i-1], 2)
}
}
R> df
ID Year Price Index Price_adj
1: A_index1 2001 NA 1.5 NA
2: A_index1 2002 NA 1.5 NA
3: A_index1 2003 10 2.0 10.00
4: A_index1 2004 NA 1.0 5.00
5: A_index1 2005 NA 2.0 10.00
6: A_index1 2006 15 2.0 15.00
7: A_index1 2007 NA 3.0 22.50
8: A_index1 2008 13 1.5 13.00
9: A_index1 2009 NA 2.0 17.33
在我的實際大的數據,我將不得不這一功能應用到多個團體和速度是一個考慮因素。我在這方面的嘗試如下,這需要幫助指向正確的方向。我確實考慮過Reduce
,但不確定它如何在組中包含前兩個元素。與cumprod
foo = function(Price, Index){
for (i in 2:nrow(df)) {
if (is.na(df$Price[i])) {
df$Price_adj[i] = df$Price_adj[i-1] * df$Index[i]/df$Index[i-1]
}
}
}
df %>%
group_by(ID) %>%
mutate(Price_adj = Price,
Price_adj = foo(Price, Index))
您可以添加更多mutate步驟的解釋嗎? – Divi
更新了一些說明... – Psidom
該公式的設置方式,該解決方案可以很容易地在下面使用,而不需要'cumprod'來提高效率。最有可能不需要'Rcpp'。謝謝。 'mutate(Price_adj = round(first(Price)* Index/first(Index),2))' – Divi