如何在TRUE和FALSE条件下计算运行总和

如何在TRUE和FALSE条件下计算运行总和,r,dplyr,R,Dplyr,我正在尝试创建一个新列,该列是基于TRUE和FALSE列的条件差异。如果lag 1行为FALSE,则我们应计算与起始行或最后一行的差值,以数据帧中较晚的为准,但是如果lag 1行为TRUE,则应重置差值 我希望尽可能多地使用dplyr::mutate函数。我正试图将dplyr::lag与ifelse一起使用,但我在处理这些条件时遇到了困难 dat <- data.frame(logic_col = c(F, F, T, T, F, F, F, T, F),

我正在尝试创建一个新列,该列是基于TRUE和FALSE列的条件差异。如果lag 1行为FALSE,则我们应计算与起始行或最后一行的差值,以数据帧中较晚的为准,但是如果lag 1行为TRUE,则应重置差值

我希望尽可能多地使用dplyr::mutate函数。我正试图将dplyr::lag与ifelse一起使用,但我在处理这些条件时遇到了困难

 dat <- data.frame(logic_col = c(F, F, T, T, F, F, F, T, F),
                   time_col = c(200, 435, 567, 895, 1012, 1345, 1456, 1700, 1900),
                   expected_col_unseen = c(200, 435, 567, 328, 117, 450, 561, 805, 200))

我会把它扔到那里,以防手动计算会让事情变得混乱:

图书馆弹琴 dat%>% 组_bygrp=cumsumlag!逻辑列,默认值=FALSE%>% mutateout=ctime\u col[1],difftime\u col%>% 解组 一个tibble:9x5 逻辑\u列时间\u列预期\u列未显示grp out 1虚假200 200 2假435 435 1 435 3真567 567 2 567 4真实895328 2 328 5假10121172 117 6假1345 450 3 1345 7假1456 561 4 1456 8真实1700 805 5 1700 9假1900 200 5 200
我们可以使用tidyr和dplyr执行类似的操作:

图书馆弹琴 图书馆三年 dat%>% mutatetmp=laglogic\u col*time\u col, tmp=ifelsetmp==0,不适用,tmp%>% tidyr::filltmp,.方向=cdown%>% mutateout=time\u col-ifelseis.natmp,0,tmp%>% 选择tmp >逻辑\u列时间\u列预期\u列未显示 >1假200 >2假435 435 >3真实567 567 567 >4真实895328 328 >5假10121117 >6假1345450450 >7假1456 561 561 >8真实1700 805 805 >9虚假1900 200 200
预期列与累积和不一致。因为第2行为false,所以第3行的预期值应该是200+435+567=1202,而不是1002。从这里看来,您期望的列似乎并不接近,因为第3行是真的,所以第4行应该是895。我认为您可能试图从预期值中减去前一行的time_col,但即使如此,累积值也不能正确结转。你能修正你的预期数据,或者扩展你的计算方法吗?谢谢你指出这一点。为了更准确,我重新编写了这个问题,我不是想做一个累积的总和,而是一个差值。从最后一个{TRUE}值开始。我同意您的第1-5行,但是由于第5-6行都是false,那么第6行不应该等于第6行的时间?col?次要细节,但是如果您使用的是dplyr,我鼓励使用dplyr::if_else vice base ifelse,因为它可以防止常见错误,从而保护您免受伤害,可以这么说。dat%>%mutateout=time\u col-laglogic\u col*time\u col,default=0您可以用这个实现您所拥有的,但这不是OP所追求的。好吧,我明白您在做什么了,这是一个简洁的快捷方式。我将坚持小组讨论,以防有更复杂的计算。我并不反对这不是预期列中的内容,但该列和问题文本之间有足够的不一致性*耸耸肩,对不起,我也很困惑。我的问题数据集是正确的。这个问题的背景是我试图计算某个部件在机器上运行了多长时间。该部件不时更换,因此我想知道某个部件在机器中的使用时间。