将数据从长格式重塑为宽格式 - 不止一个变量

Jua*_*nma 1 r reshape2 dcast

我正在尝试使用dcast函数将我的数据从长公式重塑为宽公式。

目标是在value.var参数中使用不同的变量,但 R 不允许我在其中使用多个值。

有没有其他方法可以修复它?我看过其他类似的问题,但我找不到类似的例子。

这是我当前的数据集:

+---------+------+--------+--------------+------------+
| 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 |
+---------+------+--------+--------------+------------+
Run Code Online (Sandbox Code Playgroud)

我的目标是将年份列传递给其他列(增长、失业和人口)。我正在使用下面的 dcast 函数。

data_wide <- dcast(world, country  ~ year,
     value.var=c("Growth","Unemployment","Population"))
Run Code Online (Sandbox Code Playgroud)

理想的结果

+---------+-------------+-------------------+-----------------+-------------+-------------------+-----------------+
| 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 |
+---------+-------------+-------------------+-----------------+-------------+-------------------+-----------------+
Run Code Online (Sandbox Code Playgroud)

小智 5

如果您不喜欢 dcast 解决方案,我个人觉得 tidyr 更容易。

library(tidyr)
df <- df %>% 
     gather(key, value, -Country, -Year) %>%  
     unite(new.col, c(key, Year)) %>%   
     spread(new.col, value) 
Run Code Online (Sandbox Code Playgroud)

结果

  Country Growth_2015 Growth_2016 Growth_2017 Population_2015 Population_2016 Population_2017 Unemployment_2015 Unemployment_2016 Unemployment_2017
1       A         2.0         4.0         4.5              40            42.0            42.5               8.3               8.1               8.1
2       B         3.0         3.5         4.4              32            32.5            33.0               9.2               9.0               8.4
3       C         2.5         3.7         4.3              30            31.0            30.0               9.1               9.0               8.5
4       D         1.5         3.1         4.2              27            29.0            30.0               6.1               5.3               5.2
Run Code Online (Sandbox Code Playgroud)

这工作由

将所有值堆叠到一列中...

将变量名和年份列合并为一列...

然后将新列扩展为宽格式