Rock
Rock

Reputation: 2977

Generate combination of data frame and vector

I know expand.grid is to create all combinations of given vectors. But is there a way to generate all combinations of a data frame and a vector by taking each row in the data frame as unique. For instance,

df <- data.frame(a = 1:3, b = 5:7)
c <- 9:10

how to create a new data frame that is the combination of df and c without expanding df:

df.c:
a b c
1 5 9
2 6 9
3 7 9
1 5 10
2 6 10
3 7 10

Thanks!

Upvotes: 9

Views: 4188

Answers (4)

Tom
Tom

Reputation: 87

This question is really old but I found one more answer.

Use tidyr's expand_grid().

expand_grid(df, c)

# A tibble: 6 × 3
      a     b     c
  <int> <int> <int>
1     1     5     9
2     1     5    10
3     2     6     9
4     2     6    10
5     3     7     9
6     3     7    10

Upvotes: 2

inscaven
inscaven

Reputation: 2584

As for me the simplest way is merge(df, as.data.frame(c))

  a b  c
1 1 5  9
2 2 6  9
3 3 7  9
4 1 5 10
5 2 6 10
6 3 7 10

Upvotes: 14

mnel
mnel

Reputation: 115425

You could also do something like this

do.call(rbind,lapply(9:10, function(x,d) data.frame(d, c=x), d=df)))

# or using rbindlist as a fast alternative  to do.call(rbind,list)
library(data.table)
rbindlist(lapply(9:10, function(x,d) data.frame(d, c=x), d=df)))

or

rbindlist(Map(data.frame, c = 9:10, MoreArgs = list(a= 1:3,b=5:7)))

Upvotes: 3

Marius
Marius

Reputation: 60160

This may not scale when your dataframe has more than two columns per row, but you can just use expand.grid on the first column and then merge the second column in.

df <- data.frame(a = 1:3, b = 5:7)
c <- 9:10
combined <- expand.grid(a=df$a, c=c)
combined <- merge(combined, df)
> combined[order(combined$c), ]
  a  c b
1 1  9 5
3 2  9 6
5 3  9 7
2 1 10 5
4 2 10 6
6 3 10 7

Upvotes: 9

Related Questions