Take this sample variable
df <- data.frame(month=rep(1:3,2),
student=rep(c("Amy", "Bob"), each=3),
A=c(9, 7, 6, 8, 6, 9),
B=c(6, 7, 8, 5, 6, 7))
I can use spread
from tidyr
to change this to wide format.
> df[, -4] %>% spread(student, A)
month Amy Bob
1 1 9 8
2 2 7 6
3 3 6 9
But how can I spread two values e.g. both A
and B
, such that the output is something like
month Amy.A Bob.A Amy.B Bob.B
1 1 9 8 6 5
2 2 7 6 7 6
3 3 6 9 8 7
Here's a possible both simple and very efficient solution using
data.table
Or a possible
tidyr
solutionEDIT 22/10/2019
As mentioned in comments by @gjabel, newer tidyr versions (v1.0.0+) have now
pivot_wider
andpivot_longer
functions (currently in maturing state), hence, a newer approach would be