我希望在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内的时期。所以对答案的任何额外学习将不胜感激!
答案 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 我们可以rollapplyr
与by.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