Alexander
Alexander

Reputation: 4645

Adding sequence of numbers to the data

Hi I have a data frame like this

df <-data.frame(x=rep(rep(seq(0,3),each=2),2 ),gr=gl(2,8))

     x gr
1    0  1
2    0  1
3    1  1
4    1  1
5    2  1
6    2  1
7    3  1
8    3  1
9    0  2
10   0  2
11   1  2
12   1  2
13   2  2
14   2  2
15   3  2
16   3  2

I want to add a new column numbering sequence of numbers when the x value ==0

I tried

library(dplyr)
df%>%
  group_by(gr)%>%
  mutate(numbering=seq(2,8,2))

Error in mutate_impl(.data, dots) : 
  Column `numbering` must be length 8 (the group size) or one, not 4

?

Just for side note mutate(numbering=rep(seq(2,8,2),each=2)) would work for this minimal example but for the general case its better to look x value change from 0!

the expected output

     x gr  numbering
1    0  1   2
2    0  1   2
3    1  1   4
4    1  1   4 
5    2  1   6
6    2  1   6
7    3  1   8
8    3  1   8
9    0  2   2
10   0  2   2
11   1  2   4
12   1  2   4
13   2  2   6
14   2  2   6
15   3  2   8
16   3  2   8

Upvotes: 0

Views: 219

Answers (2)

akrun
akrun

Reputation: 887881

Here is an option using match to get the index and then pass on the seq values to fill

df %>% 
   group_by(gr) %>%
   mutate(numbering = seq(2, length.out = n()/2, by = 2)[match(x, unique(x))])
# A tibble: 16 x 3
# Groups:   gr [2]
#       x gr    numbering
#   <int> <fct>     <dbl>
# 1     0 1             2
# 2     0 1             2
# 3     1 1             4
# 4     1 1             4
# 5     2 1             6
# 6     2 1             6
# 7     3 1             8
# 8     3 1             8
# 9     0 2             2
#10     0 2             2
#11     1 2             4
#12     1 2             4
#13     2 2             6
#14     2 2             6
#15     3 2             8
#16     3 2             8

Upvotes: 1

Maurits Evers
Maurits Evers

Reputation: 50738

Do you mean something like this?

library(tidyverse);
df %>%
    group_by(gr) %>%
    mutate(numbering = cumsum(c(1, diff(x) != 0)))
## A tibble: 16 x 3
## Groups:   gr [2]
#       x gr   numbering
#   <int> <fct>    <dbl>
# 1     0 1           1.
# 2     0 1           1.
# 3     1 1           2.
# 4     1 1           2.
# 5     2 1           3.
# 6     2 1           3.
# 7     3 1           4.
# 8     3 1           4.
# 9     0 2           1.
#10     0 2           1.
#11     1 2           2.
#12     1 2           2.
#13     2 2           3.
#14     2 2           3.
#15     3 2           4.
#16     3 2           4.

Or if you must have a numbering sequence 2,4,6,... instead of 1,2,3,... you can do

df %>%
    group_by(gr) %>%
    mutate(numering = 2 * cumsum(c(1, diff(x) != 0)));
## A tibble: 16 x 3
## Groups:   gr [2]
#       x gr    numering
#   <int> <fct>    <dbl>
# 1     0 1           2.
# 2     0 1           2.
# 3     1 1           4.
# 4     1 1           4.
# 5     2 1           6.
# 6     2 1           6.
# 7     3 1           8.
# 8     3 1           8.
# 9     0 2           2.
#10     0 2           2.
#11     1 2           4.
#12     1 2           4.
#13     2 2           6.
#14     2 2           6.
#15     3 2           8.
#16     3 2           8.

Upvotes: 2

Related Questions