'How to add sequence of numbers to each group of a data.frame?

I have a dataframe of US zipcodes and I want to add a sequence of numbers to each unique zipcode while repeating the rest of the rows. Right now, my data looks like so:

 zip   city        state_name   
  <chr> <chr>       <chr>        
1 01001 Agawam      Massachusetts
2 01002 Amherst     Massachusetts
3 01003 Amherst     Massachusetts
4 01005 Barre       Massachusetts
5 01007 Belchertown Massachusetts

For each row, I'd like it to look like this, (for each zipcode.)

 zip   city        state_name    Num
  <chr> <chr>       <chr>        
 01001 Agawam      Massachusetts .8
 01001 Agawam      Massachusetts 1.0
 01001 Agawam      Massachusetts 1.2
 01001 Agawam      Massachusetts 1.4

And so on for the rest of the rows.

Data here:

structure(list(zip = c("01001", "01002", "01003", "01005", "01007"
), city = c("Agawam", "Amherst", "Amherst", "Barre", "Belchertown"
), state_name = c("Massachusetts", "Massachusetts", "Massachusetts", 
"Massachusetts", "Massachusetts")), row.names = c(NA, -5L), class = c("tbl_df", 
"tbl", "data.frame"))


Solution 1:[1]

If I understand your question you can accomplish this with group_by and summarize in dplyr.

library("dplyr")

df |>
  group_by(across(everything())) |>
  summarize(Num=seq(0.8, 1.4, 0.2)) |>
  ungroup()

# A tibble: 20 × 4
   zip   city        state_name      Num
   <chr> <chr>       <chr>         <dbl>
 1 01001 Agawam      Massachusetts   0.8
 2 01001 Agawam      Massachusetts   1  
 3 01001 Agawam      Massachusetts   1.2
 4 01001 Agawam      Massachusetts   1.4
 5 01002 Amherst     Massachusetts   0.8
 6 01002 Amherst     Massachusetts   1  
 7 01002 Amherst     Massachusetts   1.2
 8 01002 Amherst     Massachusetts   1.4
 9 01003 Amherst     Massachusetts   0.8
10 01003 Amherst     Massachusetts   1  
11 01003 Amherst     Massachusetts   1.2
12 01003 Amherst     Massachusetts   1.4
13 01005 Barre       Massachusetts   0.8
14 01005 Barre       Massachusetts   1  
15 01005 Barre       Massachusetts   1.2
16 01005 Barre       Massachusetts   1.4
17 01007 Belchertown Massachusetts   0.8
18 01007 Belchertown Massachusetts   1  
19 01007 Belchertown Massachusetts   1.2
20 01007 Belchertown Massachusetts   1.4

Solution 2:[2]

Here are some alternative options:

library(dplyr)
library(tidyr)

dat %>%
  expand_grid(Num = seq(.8, 1.4, .2))

Or:

dat %>%
  uncount(4) %>%
  mutate(Num = rep(seq(.8, 1.4, .2), length.out = n()))

Or:

dat %>%
  mutate(Num = list(seq(.8, 1.4, .2))) %>%
  unnest(Num)

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 rpolicastro
Solution 2 Ritchie Sacramento