0

I would like to generate a sequence along two variables using row_number() but the result is not behaving as I expected...

library(tidyverse)
#> Warning: package 'tidyverse' was built under R version 3.6.3
#> Warning: package 'ggplot2' was built under R version 3.6.3
#> Warning: package 'tibble' was built under R version 3.6.3
#> Warning: package 'tidyr' was built under R version 3.6.2
#> Warning: package 'purrr' was built under R version 3.6.2
#> Warning: package 'dplyr' was built under R version 3.6.3
#> Warning: package 'forcats' was built under R version 3.6.3
test <- data.frame(model = c("iron", "iron", "iron", "steel", "steel"), year = c(2010, 2011, 2012, 2008, 2009))
test %>% group_by(model, year) %>% mutate(number = row_number())
#> # A tibble: 5 x 3
#> # Groups:   model, year [5]
#>   model  year number
#>   <fct> <dbl>  <int>
#> 1 iron   2010      1
#> 2 iron   2011      1
#> 3 iron   2012      1
#> 4 steel  2008      1
#> 5 steel  2009      1

Based on my understanding of the code above I would expect the number column to be 1, 2, 3 so the data frame would result in...

data.frame(model = c("iron", "iron", "iron", "steel", "steel"), 
           year = c(2010, 2011, 2012, 2008, 2009), 
           number = c(1, 2, 3, 1, 2))
#>   model year number
#> 1  iron 2010      1
#> 2  iron 2011      2
#> 3  iron 2012      3
#> 4 steel 2008      1
#> 5 steel 2009      2

How do I achieve this result?

spies006
  • 2,867
  • 2
  • 19
  • 28

1 Answers1

1

If you group_by columns, R will create a "partition" for each column and within each partition, the row numbers will increment. From your expected output, looks like you don't need group by.

> df %>% mutate(number = row_number())
  model year number
1  iron 2010      1
2  iron 2011      2
3  iron 2012      3
> 

Then you'd want to group by just model:

> test %>% group_by(model) %>% mutate(number = row_number())
# A tibble: 5 x 3
# Groups:   model [2]
  model  year number
  <chr> <dbl>  <int>
1 iron   2010      1
2 iron   2011      2
3 iron   2012      3
4 steel  2008      1
5 steel  2009      2
> 
Karthik S
  • 11,348
  • 2
  • 11
  • 25