Home > Software engineering >  Flag run-length of grouped intervals
Flag run-length of grouped intervals

Time:09-15

I have a dataframe grouped by grp:

df <- data.frame(
  v = rnorm(25),
  grp = c(rep("A",10), rep("B",15)),
  size = 2)

I want to flag the run-length of intervals determined by size. For example, for grp == "A", size is 2, and the number of rows is 10. So the interval should have length 10/2 = 5. This code, however, creates intervals with length 2:

df %>%
  group_by(grp) %>%
  mutate(
    interval = (row_number() -1) %/% size)
# A tibble: 25 × 4
# Groups:   grp [2]
        v grp    size interval
    <dbl> <chr> <dbl>    <dbl>
 1 -0.166 A         2        0
 2 -1.12  A         2        0
 3  0.941 A         2        1
 4 -0.913 A         2        1
 5  0.486 A         2        2
 6 -1.80  A         2        2
 7 -0.370 A         2        3
 8 -0.209 A         2        3
 9 -0.661 A         2        4
10 -0.177 A         2        4
# … with 15 more rows

How can I flag the correct run-length of the size-determined intervals? The desired output is this:

# A tibble: 25 × 4
# Groups:   grp [2]
        v grp    size interval
    <dbl> <chr> <dbl>    <dbl>
 1 -0.166 A         2        0
 2 -1.12  A         2        0
 3  0.941 A         2        0
 4 -0.913 A         2        0
 5  0.486 A         2        0
 6 -1.80  A         2        1
 7 -0.370 A         2        1
 8 -0.209 A         2        1
 9 -0.661 A         2        1
10 -0.177 A         2        1
# … with 15 more rows

CodePudding user response:

If I interpreted your question correctly, this small change should do the trick?

df %>%
  group_by(grp) %>%
  mutate(
    interval = (row_number() -1) %/% (n()/size))

CodePudding user response:

You can use gl:

df %>% 
  group_by(grp) %>% 
  mutate(interval = gl(first(size), ceiling(n() / first(size)))[1:n()])

output

# A tibble: 26 × 4
# Groups:   grp [2]
         v grp    size interval
     <dbl> <chr> <dbl> <fct>   
 1 -1.12   A         2 1       
 2  3.04   A         2 1       
 3  0.235  A         2 1       
 4 -0.0333 A         2 1       
 5 -2.73   A         2 1       
 6 -0.0998 A         2 1       
 7  0.976  A         2 2       
 8  0.414  A         2 2       
 9  0.912  A         2 2       
10  1.98   A         2 2       
11  1.17   A         2 2       
12 -0.509  B         2 1       
13  0.704  B         2 1       
14 -0.198  B         2 1       
15 -0.538  B         2 1       
16 -2.86   B         2 1       
17 -0.790  B         2 1       
18  0.488  B         2 1       
19  2.17   B         2 1       
20  0.501  B         2 2       
21  0.620  B         2 2       
22 -0.966  B         2 2       
23  0.163  B         2 2       
24 -2.08   B         2 2       
25  0.485  B         2 2       
26  0.697  B         2 2 
  • Related