在下面的可重现代码中,我想使用dplyr为SumIf添加一个列,如下图所示,即图像H列中的Excel sumifs()
公式具有指定范围的顶部"锚定"的条件,以便在您按行向下移动时进行"滚动"计算.对于如何在dplyr中做同样的事情,有什么建议吗?我肯定这需要分组,但不确定如何处理条件.下面的蓝色显示了当前可重现的代码输出,黄色显示了我想要添加的内容,非突出显示的显示了底层的XLS公式.
现在用我的话:为了得出Sumif,对于从数组的顶部到底部一次滚动的每一行,将列D中从列D范围的顶部到列D范围中的当前行的所有值相加,这些值的列C"Code1"值小于当前行列C"Code1"值.例如,在单元格G6中导出3的值:将单元格D3中的1(因为其0的Code1(单元格C3)是<;Code1的3(单元格C6))与单元格D5中的2相加(因为其1的Code1(单元格C5)是<;3的Code1(单元格C6)).
可重现代码:
library(dplyr)
myData <-
data.frame(
Name = c("B","R","R","R","R","B","A","A","A"),
Group = c(0,1,1,2,2,0,0,0,0),
Code1 = c(0,1,1,3,3,4,-1,0,0),
Code2 = c(1,0,2,0,1,2,1,0,0)
)
CountIfs <- function(x,y) {
out <- integer(length(x))
for(i in seq_along(x)) {
cond1 <- y[1:i] > 0
cond2 <- x[1:i] == x[i]
out[i] <- sum(cond1*cond2)
}
out
}
myDataRender <-
myData %>%
mutate(CountIfs = CountIfs(Code1, Code2))
print.data.frame(myDataRender)
Adapt Tsai solution for situations where the top/bottom of the XLS 100 ranges are anchored (fixed, not rolling)(其中图像中的第一个XLS公式将是=SUMIFS(D$3:D$11,C$3:$C11,"<"&C3)
),对于我们这些从XLS过渡到R的人:
myData %>% mutate(SumIfs = sapply(1:n(), function(x) sum(Code2[1:n()][Code1[1:n()] < Code1[x]])))