Expand a Data Frame in R

Expand a Data Frame in R

I have a data frame like below:-

                            Var1                  Var2
    1                        a                     a
    2                        a                     b
    3                        b                     a
    4                        b                     b

I want an ID column containing values 1 and 2. How do I expand the above data frame so that the final data frame looks something like this?

                            Var1                  Var2  ID
    1                        a                     a     1
    2                        a                     b     1
    3                        b                     a     1
    4                        b                     b     2
    1                        a                     a     2
    2                        a                     b     2
    3                        b                     a     2
    4                        b                     b     2

Ahh thanks to MKR, the issue is due to the package.

      library(dplyr)

df <- read.table(text = 
                   "Var1                  Var2
                 1                        a                     a
                 2                        a                     b
                 3                        b                     a
                 4                        b                     b",
                 header = TRUE, stringsAsFactors = FALSE)



df %>% group_by(Var1, Var2) %>% expand(ID = 1:2) %>%
  arrange(ID)
2

3 Answers

Many options available to get the desired result. But perhaps OP seems to be keen on using tidyr::expand. A solution can be as:

library(dplyr)
library(tidyr)

df %>% group_by(Var1, Var2) %>% expand(ID = 1:2) %>%
  arrange(ID)

# # A tibble: 8 x 3
# # Groups: Var1, Var2 [4]
#   Var1  Var2     ID
#   <chr> <chr> <int>
# 1 a     a         1
# 2 a     b         1
# 3 b     a         1
# 4 b     b         1
# 5 a     a         2
# 6 a     b         2
# 7 b     a         2
# 8 b     b         2

Data:

df <- read.table(text = 
"Var1                  Var2
  1                        a                     a
  2                        a                     b
  3                        b                     a
  4                        b                     b",
header = TRUE, stringsAsFactors = FALSE)
8

tidyr::expand did not work for me. However, tidyr::crossing worked like a charm.

The solution using crossing is:

library(tidyr)
library(dplyr)

df %>% crossing(ID = c(1:2)) %>% arrange(ID)

# # A tibble: 8 x 3
#   Var1  Var2     ID
#   <chr> <chr> <int>
# 1 a     a         1
# 2 a     b         1
# 3 b     a         1
# 4 b     b         1
# 5 a     a         2
# 6 a     b         2
# 7 b     a         2
# 8 b     b         2

Data (gratefully copied from MKR <3):

df <- read.table(text = 
"Var1                  Var2
  1                        a                     a
  2                        a                     b
  3                        b                     a
  4                        b                     b",
header = TRUE, stringsAsFactors = FALSE)

Here's something quite general:

library(dplyr)

x <- head(cars,2)
bind_rows(replicate(3,x,simplify = FALSE),.id="ID")
#   ID speed dist
# 1  1     4    2
# 2  1     4   10
# 3  2     4    2
# 4  2     4   10
# 5  3     4    2
# 6  3     4   10

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Marcus Vance
Author

Marcus Vance

Marcus Vance is a cybersecurity auditor and technology writer dedicated to educating the public about online safety, data privacy regulations, enterprise security, and emerging cyber threats.