在下面的可重现代码中,我想使用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)).

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)

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]]))) 

推荐答案

您可以使用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

如果您不想依赖purrr,map()解决方案可以直接适用于基础sapply()版本:

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

R相关问答推荐

按条件计算观察次数

如果窗口在CLARME或集团之外,则有条件领先/滞后滚动总和返回NA

如何在弹性表中为类别值的背景上色

为什么以及如何修复Mapview不显示所有点并且st_buffer合并一些区域R?

使用tidyverse / Mutate的存款账户余额

RStudio中相关数据的分组箱形图

错误:非常长的R行中出现意外符号

为什么舍入POSIXct会更改能力以匹配等效的POSIXct?

根据另一列中的值和条件查找新列的值

R -如何分配夜间GPS数据(即跨越午夜的数据)相同的开始日期?

如何使用前缀作为匹配来连接数据帧?

在R中,如何从一系列具有索引名的变量快速创建数据帧?

使用来自嵌套列和非嵌套列的输入的PURRR:MAP和dplyr::Mariate

通过初始的shiny 应用更新部署的shiny 应用的数据和参数,其中部署的应用程序显示为URL

R基于变量组合创建新的指标列

如何显示准确的p值而不是<;0.001*?

按两个因素将观测值分组后计算单独的百分比

按组使用dummy r获取高于标准的行的平均值

如何使用循环从R中的聚合函数创建列,而不会在名称中给出&q;$&q;?

如何捕获这个shiny 的、可扩展的react 性用户输入矩阵作为另一个react 性对象,以便进一步操作?