gpt4 book ai didi

r - 如何在 dplyr 中执行相当于 Excel 滚动 sumifs 的操作?

转载 作者:行者123 更新时间:2023-12-05 01:03:49 26 4
gpt4 key购买 nike

在下面的可重现代码中,我想使用 dplyr 为 SumIfs 添加一列,如下图所示,其中 Excel sumifs()图像 H 列中的公式具有指定范围顶部“锚定”的条件,以便在您逐行向下移动时进行“滚动”计算。关于如何在 dplyr 中执行相同操作的任何建议?我确定它需要分组,但不确定如何处理条件。下面的蓝色显示当前可重现的代码输出,黄色显示我要添加的内容,未突出显示的显示底层 XLS 公式。

现在用我的话来说:要导出 Sumif,对于从数组的顶部到底部依次滚动的每一行,将 D 列中的所有值从 D 列范围的顶部求和到列 D 范围中的当前行,其列 C“Code1”值小于当前行列 C“Code1”值。因此,例如在单元格 G6 中推导 3 的值:将单元格 D3 中的 1(因为其 Code1 为 0(单元格 C3)

enter image description here

可重现的代码:

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)

在 XLS 的顶部/底部 sumifs() 的情况下调整 Tsai 解决方案范围是固定的(固定的,不是滚动的)(图像中的第一个 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]]))) 

最佳答案

您可以使用 purrr 中的 map()imap():

library(dplyr)
library(purrr)

# (1)
myData %>%
mutate(SumIfs = map_dbl(1:n(), ~ sum(Code2[1:.x][Code1[1:.x] < Code1[.x]])))

# (2)
myData %>%
mutate(SumIfs = imap_dbl(Code1, ~ sum(Code2[1:.y][Code1[1:.y] < .x])))
#   Name Group Code1 Code2 SumIfs
# 1 B 0 0 1 0
# 2 R 1 1 0 1
# 3 R 1 1 2 1
# 4 R 2 3 0 3
# 5 R 2 3 1 3
# 6 B 0 4 2 4
# 7 A 0 -1 1 0
# 8 A 0 0 0 1
# 9 A 0 0 0 1

如果不想依赖purrrmap()方案可以直接适配基础sapply()版本:

myData %>%
mutate(SumIfs = sapply(1:n(), \(x) sum(Code2[1:x][Code1[1:x] < Code1[x]])))

关于r - 如何在 dplyr 中执行相当于 Excel 滚动 sumifs 的操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73447512/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com