2017-07-02 18 views
2

我期待鍛鍊總計超過一回頭範圍R.的R - 回首的總和射程超過回溯期,分總和 - 擅長於R

個我知道如何與這樣做在Excel中以下公式:

=SUM(B2:B4)/SUM(B2:B4,C2:C4) 

這是在今天回顧3行的範圍內求和B列。然後再把這筆總和再買回B列+ C列的總和三回。

我期待在R中實現相同的計算來運行我的矩陣。

輸出會是這個樣子:

adv dec perct 
1 69 376 
2 113 293 
3 270 150 0.355625492 
4 74 371 0.359559402 
5 308 96 0.513790386 
6 236 173 0.491255962 
7 252 134 0.663886572 
8 287 129 0.639966969 
9 219 187 0.627483444 

這是一行代碼,我也許還能添加回頭範圍太:

perct <- apply(data.matrix[,c('adv','dec')], 1, function(x) { (x[1]/x[1] + x[2]) }) 

如果我能得到[1]到總和前面的3行範圍和 如果我能得到[2]也總結前面的3行範圍。

不斷學習如何在R中應用前進和回顧期。因此,任何額外的答案學習將不勝感激!

回答

2

以下是一些方法。第一3使用rollsumr和/或在rollapplyr動物園和最後一個只使用rollsumr的R.

1)的基極與rollsumr其列包含rollling總和創建矩陣,將其轉換成排的比例和取"adv"列。最後將其分配到DF中的新列frac。這種方法具有最短的代碼。

library(zoo) 

DF$frac <- prop.table(rollsumr(DF, 3, fill = NA), 1)[, "adv"] 

,並提供:

> DF 
    adv dec  frac 
1 69 376  NA 
2 113 293  NA 
3 270 150 0.3556255 
4 74 371 0.3595594 
5 308 96 0.5137904 
6 236 173 0.4912560 
7 252 134 0.6638866 
8 287 129 0.6399670 
9 219 187 0.6274834 

1A)這種變化是隻是不使用prop.table我們寫出的比率相似。代碼更長,但您可能會發現它更清晰。

m <- rollsumr(DF, 3, fill = NA) 
DF$frac <- with(as.data.frame(m), adv/(adv + dec)) 

1B)這是一個變化(1)是相同的,除了它使用magrittr管道:

library(magrittr) 

DF %>% rollsumr(3, fill = NA) %>% prop.table(1) %>% `[`(TRUE, "adv") -> DF$frac 

2)rollapplyr我們可以使用rollapplyrby.column = FALSE這樣。結果是一樣的。

ratio <- function(x) sum(x[, "adv"])/sum(x) 
DF$frac <- rollapplyr(DF, 3, ratio, by.column = FALSE, fill = NA) 

3)另一種變型是計算單獨的分子和分母:

​​

4)基這使用embed隨後rowSums每一列上得到所述滾動總和及然後如(1)中那樣使用prop.table

DF$frac <- prop.table(sapply(lapply(rbind(NA, NA, DF), embed, 3), rowSums), 1)[, "adv"] 

注:在重現的形式使用的輸入是:

Lines <- "adv dec 
1 69 376 
2 113 293 
3 270 150 
4 74 371 
5 308 96 
6 236 173 
7 252 134 
8 287 129 
9 219 187" 
DF <- read.table(text = Lines, header = TRUE) 
+0

這是在動物園包內完成它的好方法!謝謝你的幫助! –

+0

很好的回答!謝謝你解釋! –

2

考慮一個sapply,通過行數,以便循環到索引兩行回:

DF$pred <- sapply(seq(nrow(DF)), function(i) 
    ifelse(i>=3, sum(DF$adv[(i-2):i])/(sum(DF$adv[(i-2):i]) + sum(DF$dec[(i-2):i])), NA)) 

DF 
# adv dec  pred 
# 1 69 376  NA 
# 2 113 293  NA 
# 3 270 150 0.3556255 
# 4 74 371 0.3595594 
# 5 308 96 0.5137904 
# 6 236 173 0.4912560 
# 7 252 134 0.6638866 
# 8 287 129 0.6399670 
# 9 219 187 0.6274834 
+0

謝謝 - 很高興看到它如何在循環中工作 –