Home > Software engineering >  How to create unique data frame rows from inputs of 2 lists
How to create unique data frame rows from inputs of 2 lists

Time:04-27

In this example I have a list with 4 values (Lot) and another with 3 (Method).

Lot <- c("A", "B", "C", "D")
Method <- c(1,2,3)

I need to create a data frame with a Lot and Method column where their values are repeated so each row is unique. I need it to look like this:

#    Lot Method
# 1    A      1
# 2    A      2
# 3    A      3
# 4    B      1
# 5    B      2
# 6    B      3
# 7    C      1
# 8    C      2
# 9    C      3
# 10   D      1
# 11   D      2
# 12   D      3

How can this be done without creating 2 long repetitive lists like this:

Lot <- c("A","A","A", "B","B","B","C","C","C","D","D","D")
Method <- c(1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3)

CodePudding user response:

Using expand.grid you could do

df <- expand.grid(
  Lot = c("A", "B", "C", "D"),
  Method = c(1,2,3)
)
df
#>    Lot Method
#> 1    A      1
#> 2    B      1
#> 3    C      1
#> 4    D      1
#> 5    A      2
#> 6    B      2
#> 7    C      2
#> 8    D      2
#> 9    A      3
#> 10   B      3
#> 11   C      3
#> 12   D      3

And using order:

df[order(df$Lot),]
#>    Lot Method
#> 1    A      1
#> 5    A      2
#> 9    A      3
#> 2    B      1
#> 6    B      2
#> 10   B      3
#> 3    C      1
#> 7    C      2
#> 11   C      3
#> 4    D      1
#> 8    D      2
#> 12   D      3

Or using the tidyverse you could do:

tidyr::expand_grid(
  Lot = c("A", "B", "C", "D"),
  Method = c(1,2,3)
)
#> # A tibble: 12 × 2
#>    Lot   Method
#>    <chr>  <dbl>
#>  1 A          1
#>  2 A          2
#>  3 A          3
#>  4 B          1
#>  5 B          2
#>  6 B          3
#>  7 C          1
#>  8 C          2
#>  9 C          3
#> 10 D          1
#> 11 D          2
#> 12 D          3

CodePudding user response:

With data.table, we can use CJ:

library(data.table)

CJ(Lot = c("A", "B", "C", "D"),
   Method = c(1, 2, 3))

Output

    Lot Method
 1:   A      1
 2:   A      2
 3:   A      3
 4:   B      1
 5:   B      2
 6:   B      3
 7:   C      1
 8:   C      2
 9:   C      3
10:   D      1
11:   D      2
12:   D      3
  • Related