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)
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)
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)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With