R - 回溯期间的总和范围,回头的总和 - excel到R

时间:2017-07-02 01:26:30

标签: r

我希望在R的回望范围内锻炼一个百分比。

我知道如何使用以下公式在Excel中执行此操作:

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

这是在今天回顾3行的范围内对B列求和。然后将此总和除以B + C列的总和再次回顾3行。

我希望在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 个答案:

答案 0 :(得分:2)

以下是一些方法。前3个在动物园中使用rollsumr和/或rollapplyr,最后一个仅使用R的基础。

1)rollsumr 创建一个包含rollsumr的矩阵,其列包含滚动总和,将其转换为行比例并获取"adv"列。最后将其分配到frac中的新列DF。这种方法的代码最短。

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) 。结果是一样的。

DF$frac <- rollsumr(DF$adv, 3, fill = NA) / 
    rollapplyr(DF, 3, sum, by.column = FALSE, fill = NA)

3)另一种变化是分别计算分子和分母:

embed

4)base 这会在每列上使用rowSums后跟prop.table来获取滚动总和,然后使用{1}},如(1)中所示。

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)

答案 1 :(得分: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