如果“当前”总和超过某个阈值,我想使用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
您可以看到第一次“组”没有重置。
答案 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