Advertisements

Can anyone point me to a way to group pairs of numbers into sets. For e.g.

```
g a set
1 a 1 1
2 a 2 1
3 b 1 1
4 b 2 1
5 c 1 1
6 c 2 1
7 c 3 2
8 c 4 2
9 d 1 1
10 d 2 1
11 e 1 1
12 e 2 1
13 e 3 2
14 e 4 2
15 e 5 3
16 e 6 3
```

Here each group, `g`

, has a counter, `a`

. In a, 1 and 2 are set 1, 3 and 4 are set 2, 5 and 6 are set 3 and so. Is there a way top formalise the calculation of set as a increases to any number? If so what tools in R would facilitate this?

I have tried using cumsum with `dply:group_by()`

but this is clearly incorrect

```
df <- df %>% group_by(g) %>% mutate(set = cumsum(a))
g a set
<chr> <dbl> <dbl>
1 a 1 1
2 a 2 3
3 b 1 1
4 b 2 3
5 c 1 1
6 c 2 3
7 c 3 6
8 c 4 10
9 d 1 1
10 d 2 3
11 e 1 1
12 e 2 3
13 e 3 6
14 e 4 10
15 e 5 15
16 e 6 21
```

### >Solution :

I think you can just use some modular arithmetic here. Subtract 1 from `a`

and find the integer part after dividing by 2. Add 1 to this to get your result.

```
df %>% mutate(set = (a - 1) %/% 2 + 1)
#> g a set
#> 1 a 1 1
#> 2 a 2 1
#> 3 b 1 1
#> 4 b 2 1
#> 5 c 1 1
#> 6 c 2 1
#> 7 c 3 2
#> 8 c 4 2
#> 9 d 1 1
#> 10 d 2 1
#> 11 e 1 1
#> 12 e 2 1
#> 13 e 3 2
#> 14 e 4 2
#> 15 e 5 3
#> 16 e 6 3
```