使用基本样本生成随机数时排除0

问题描述

我有一个如下所示的数据框

  id    shift_back shift_forward
  <chr>      <dbl>         <dbl>
1 11          -140             0
2 12           -63           149
3 13           -37           327
4 14             0           193
5 16           -30            30
6 17           -30            30
7 18           -30            30
8 19           -30            30

我想用这些列shift_backshift_forward作为范围间隔来生成一个随机数。

但是,我不希望随机数为0

下面的代码可以正常工作,但也可以包含0

mutate(shift = base::sample(seq(shift_back,shift_forward,by = 1),1))

但是,这会产生如下所示的输出,也可以将0作为移位值

enter image description here

如何生成一个在该范围内但不包括0(从间隔中)的随机数。基本上,我不希望shift值为0(零)。

enter image description here

解决方法

您可以在采样前排除零。

library(dplyr)

df %>%
  rowwise() %>% 
  mutate(shift = seq(shift_back,shift_forward) %>% .[. != 0] %>% sample(1))
,
library(tidyverse)

df <- tibble(
  id = 11:14,shift_back = c(-140,-63,-37,0),shift_forward = c(0,149,327,193)
)

df %>%
  rowwise() %>%
  mutate(shift = list(seq(shift_back,shift_forward,by = 1)),shift = list(shift[shift != 0]),shift = sample(shift,1))