Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

expand a data frame in R

Tags:

r

dplyr

tidyverse

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)
like image 835
itthrill Avatar asked Nov 16 '25 18:11

itthrill


2 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)
like image 198
MKR Avatar answered Nov 18 '25 08:11

MKR


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)
like image 35
Mirjam Avatar answered Nov 18 '25 07:11

Mirjam



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!