重置

时间:2018-03-02 20:22:17

标签: r dplyr

如果“当前”总和超过某个阈值,我想使用dplyr生成带有重置的累积和。在下面,我想在'a'上积累。

library(dplyr)
library(tibble)

tib <- tibble(
  t = c(1,2,3,4,5,6),
  a = c(2,3,1,2,2,3)
)

# what I want
## thresh = 5
# A tibble: 6 x 4
#         t     a     g     c
#      <dbl> <dbl> <int> <dbl>
#   1  1.00  2.00     0  2.00
#   2  2.00  3.00     0  5.00
#   3  3.00  1.00     1  1.00
#   4  4.00  2.00     1  3.00
#   5  5.00  2.00     1  5.00
#   6  6.00  3.00     2  3.00

# what I want
## thresh = 4
# A tibble: 6 x 4
#         t     a     g     c
#      <dbl> <dbl> <int> <dbl>
#   1  1.00  2.00     0  2.00
#   2  2.00  3.00     0  5.00
#   3  3.00  1.00     1  1.00
#   4  4.00  2.00     1  3.00
#   5  5.00  2.00     1  5.00
#   6  6.00  3.00     2  3.00

# what I want
## thresh = 6
# A tibble: 6 x 4
#         t     a     g     c
#      <dbl> <dbl> <int> <dbl>
#   1  1.00  2.00     0  2.00
#   2  2.00  3.00     0  5.00
#   3  3.00  1.00     0  6.00
#   4  4.00  2.00     1  2.00
#   5  5.00  2.00     1  4.00
#   6  6.00  3.00     1  7.00

我在这里检查了很多类似的问题(例如resetting cumsum if value goes to negative in r)并且得到了我希望接近的但是没有。

我尝试了

的变体
thresh <-5
tib %>%
  group_by(g = cumsum(lag(cumsum(a) >= thresh, default = FALSE))) %>%
  mutate(c = cumsum(a)) %>%
  ungroup()

返回

# A tibble: 6 x 4
      t     a     g     c
  <dbl> <dbl> <int> <dbl>
1  1.00  2.00     0  2.00
2  2.00  3.00     0  5.00
3  3.00  1.00     1  1.00
4  4.00  2.00     2  2.00
5  5.00  2.00     3  2.00
6  6.00  3.00     4  3.00

您可以看到第一次“组”没有重置。

3 个答案:

答案 0 :(得分:3)

我认为你可以在这里使用StackPane root = new StackPane(); double width = 300; double height = 300; @Override public void start(Stage primaryStage) { Scene scene = new Scene(root, width, height); primaryStage.setTitle("Hello World!"); primaryStage.setScene(scene); primaryStage.show(); configure(); } private void configure() { Label error = new Label("Error connecting"); error.setFont(Font.font(20)); error.setPrefWidth(width); error.setAlignment(Pos.TOP_RIGHT); root.getChildren().add(error); error.setVisible(false); // Timeline disableVisibility = new Timeline( new KeyFrame( Duration.seconds(2), new KeyValue(error.visibleProperty(), false) ) ); // new Thread(() -> { while (true) { try { TimeUnit.SECONDS.sleep(5); error.setVisible(true); disableVisibility.playFromStart(); } catch (Exception e) { return; } } }).start(); } /** * @param args the command line arguments */ public static void main(String[] args) { launch(args); } 来提供帮助。我还制作了一个包装函数用于不同的阈值

accumulate()

答案 1 :(得分:0)

如果您对基于cumsum < threshold的小组建设感兴趣,

您可以使用以下base::函数:

cumSumReset <- function(x, thresh = 4) {
    ans    <- numeric()
    i      <- 0

    while(length(x) > 0) {
        cs_over <- cumsum(x)
        ntimes <- sum( cs_over <= thresh )
        x      <- x[-(1:ntimes)]
        ans <- c(ans, rep(i, ntimes))
        i   <- i + 1
    }
    return(ans)
}

致电:

tib %>% mutate(g = cumSumReset(a, 5))

结果:

#   A tibble: 6 x 3
#      t     a     g
#  <dbl> <dbl> <dbl>
#1     1     2     0
#2     2     3     0
#3     3     1     1
#4     4     2     1
#5     5     2     1
#6     6     3     2

  • g组中,您现在可以做任何您想做的事。

答案 2 :(得分:0)

我知道这是一个有点老的问题,但我在搜索类似问题时遇到了这个问题,因此我想在这里也包含这种替代方法。

library MESS 有一个内置函数 cumsumbinning() 可以满足这些需求。因为在这里你需要在停止之前穿过那个 threshold,你可以像这样使用它(使用 threshold - 1 并在第三个参数中设置 cutwhenpassed = TRUE

library(tidyverse)
library(MESS)

tib <- tibble(
  t = c(1,2,3,4,5,6),
  a = c(2,3,1,2,2,3)
)
n <- 5 # threshold

tib %>%
  group_by(g = cumsumbinning(a, n-1, TRUE) -1) %>%
  mutate(c = cumsum(a))
#> # A tibble: 6 x 4
#> # Groups:   g [3]
#>       t     a     g     c
#>   <dbl> <dbl> <dbl> <dbl>
#> 1     1     2     0     2
#> 2     2     3     0     5
#> 3     3     1     1     1
#> 4     4     2     1     3
#> 5     5     2     1     5
#> 6     6     3     2     3

n <- 4 # threshold

tib %>%
  group_by(g = cumsumbinning(a, n-1, TRUE) -1) %>%
  mutate(c = cumsum(a))
#> # A tibble: 6 x 4
#> # Groups:   g [3]
#>       t     a     g     c
#>   <dbl> <dbl> <dbl> <dbl>
#> 1     1     2     0     2
#> 2     2     3     0     5
#> 3     3     1     1     1
#> 4     4     2     1     3
#> 5     5     2     1     5
#> 6     6     3     2     3

n <- 6 # threshold

tib %>%
  group_by(g = cumsumbinning(a, n-1, TRUE) -1) %>%
  mutate(c = cumsum(a))
#> # A tibble: 6 x 4
#> # Groups:   g [2]
#>       t     a     g     c
#>   <dbl> <dbl> <dbl> <dbl>
#> 1     1     2     0     2
#> 2     2     3     0     5
#> 3     3     1     0     6
#> 4     4     2     1     2
#> 5     5     2     1     4
#> 6     6     3     1     7