"Transpose" 没有 for 循环的数据框

"Transpose" data frame without for loops

我并不是真的要转置数据框本身。但我想要实现的是类似的东西。

我有一个(非常大的)数据框,格式为:

variable    country         iso     2007    2008    2009    2010    2011    2012    2014
Var1        Argentina       ARG     67.3    65      63.6    60.4    56.6    54.4    57.3
Var2        Argentina       ARG     196.785 196.918 207.487 209.596 219.171 216.852 213.124
Var1        Austria         AUT     97.3    95      63.6    60.4    56.6    54.4    57.3
Var2        Austria         AUT     296.785 396.918 207.487 209.596 219.171 216.852 213.124

许多变量、年份和国家依此类推。

我想以以下形式获取它:

country iso year Var1 Var2
Argentina ARG 2007 67.3 196.785
Argentina ARG 2008 65 196.918
.
.
Austria AUT 2007 97.3 296.785
Austria AUT 2008 95 396.918

等等..

有没有什么干净的方法可以不借助 for 循环等来做到这一点??

我想一定有 dplyr merge 函数的一些变体可以完成这个,但我似乎找不到任何东西。

tidyr 可以为您做这件事。使用 gatherspread。学好这两个还是很值得的,看例子:

library(tidyr)

df1 <- data.frame(
    variable = c("Var1", "Var2", "Var1", "Var2"),
     country = c("Argentina", "Argentina", "Austria", "Austria"),
         iso = c("ARG", "ARG", "AUT", "AUT"),
       X2007 = c(67.3, 196.785, 97.3, 296.785),
       X2008 = c(65, 196.918, 95, 396.918),
       X2009 = c(63.6, 207.487, 63.6, 207.487),
       X2010 = c(60.4, 209.596, 60.4, 209.596),
       X2011 = c(56.6, 219.171, 56.6, 219.171),
       X2012 = c(54.4, 216.852, 54.4, 216.852),
       X2014 = c(57.3, 213.124, 57.3, 213.12)
)

df1 %>% gather(Year, Value, -c(variable:iso)) %>% 
      spread(variable, Value)

阅读插图以更好地了解它的工作原理。