This question already has an answer here:
- Reshape multiple values at once 2 answers
I’m trying to reshape my data from long to wide formula using the dcast
function from reshape2.
The objective is to use different variables in the value.var
parameter but R doesn't let me use more than one value in it.
Is there any other way I could fix it? I've looked at other similar questions but I haven't been able to find a similar examples.
Here is my current dataset:
+---------+------+--------+--------------+------------+
| Country | Year | Growth | Unemployment | Population |
+---------+------+--------+--------------+------------+
| A | 2015 | 2 | 8.3 | 40 |
| B | 2015 | 3 | 9.2 | 32 |
| C | 2015 | 2.5 | 9.1 | 30 |
| D | 2015 | 1.5 | 6.1 | 27 |
| A | 2016 | 4 | 8.1 | 42 |
| B | 2016 | 3.5 | 9 | 32.5 |
| C | 2016 | 3.7 | 9 | 31 |
| D | 2016 | 3.1 | 5.3 | 29 |
| A | 2017 | 4.5 | 8.1 | 42.5 |
| B | 2017 | 4.4 | 8.4 | 33 |
| C | 2017 | 4.3 | 8.5 | 30 |
| D | 2017 | 4.2 | 5.2 | 30 |
+---------+------+--------+--------------+------------+
My objective is to pass year column to the rest of the columns (growth, unemployment and population). I’m using the below dcast function.
data_wide <- dcast(world, country ~ year,
value.var=c("Growth","Unemployment","Population"))
Ideal outcome
+---------+-------------+-------------------+-----------------+-------------+-------------------+-----------------+
| Country | Growth_2015 | Unemployment_2015 | Population_2015 | Growth_2016 | Unemployment_2016 | Population_2016 |
+---------+-------------+-------------------+-----------------+-------------+-------------------+-----------------+
| A | 2 | 8.3 | 40 | 4 | 8.1 | 42 |
| B | 3 | 9.2 | 32 | 3.5 | 9 | 32.5 |
| C | 2.5 | 9.1 | 30 | 3.7 | 9 | 31 |
| D | 1.5 | 6.1 | 27 | 3.1 | 5.3 | 29 |
+---------+-------------+-------------------+-----------------+-------------+-------------------+-----------------+
The
dcast()
statement given by the OP works almost perfect with the recent versions of thedata.table
package as these allow for multiple measure variables to be used withdcast()
andmelt()
:This is the same result as the
tidyr
solution.However, the OP has requested a specific column order for his ideal solution where the different measure variables of each year are grouped together.
If the proper order of columns is important, there are two ways to achieve this. The first approach is to reorder the columns appropriately using
setcolorder()
:Note the the cross join function
CJ()
is used to create the cross product of the vectors.The other approach to achieve the desired column order is to melt and recast:
If you're not married to a dcast solution, I personally find tidyr easier.
Result
This works by
Stacking all values into one column...
Combining variable name and year columns into a single column...
The new column is then spread into wide format